auto_detect_first_line) { $this->shiftToFirstValuableLine(); } // будем считать количество пустых строк подряд - при достижении $empty_lines_quantity - считаем что это конец файла и выходим $empty_lines = 0; while ( $empty_lines < $this->empty_lines_quantity ) { // прочтем строку из файла $this->readRow(); // уберем пустые колонки из ряда $this->filterRow(); if ( $this->isEmptyRow() ) { //счетчик пустых строк //CustomVarDamp::dump($this->current_row_number); $empty_lines++; continue; } $this->adjustRowToSettings( ); // строка не пустая, имеем прочитанный массив значений $this->current_row_number++; // для первой строки утановим ключи из заголовка if ( !$this->setKeysFromHeader() ) { $this->setResult(); } // если у нас установлен лимит, при его достижении прекращаем парсинг if ( $this->isLastLine() ) break; // обнуляем счетчик, так как считаюся пустые строки ПОДРЯД $empty_lines = 0; } } /** * определяет первую значимую строку, * считывается файл пока в нем не встретится строка с непустыми колонками * в количестве указанном в атрибуте min_column_quantity * в результате выполнения $current_row_number будет находится на последней незначимой строке */ protected function shiftToFirstValuableLine() { do { $this->current_row_number ++; $this->readRow(); } while( $this->isEmptyRow() ); // @todo - сделать опционально // код для того что бы парсить первую строку, закомментировано как предполагается что первая значимая строка это заголовок // $this->current_row_number --; // $this->file->seek( $this->current_row_number ); } /** * @return array - одномерный массив результата парсинга строки */ protected function adjustRowToSettings( ) { // если есть заголовок, то перед конвертацией его нужно назначить if ( $this->keys !== NULL ) { if (count($this->keys) !== count($this->row)) { throw new \Exception("Ошибка парсинга файла в строке # {$this->current_row_number}. Не соответсвие числа ключевых колонок (заголовка) - числу колонок с данными"); } $this->row = array_combine($this->keys, $this->row); } // попытаемся конвертировать прочитанные значения согласно конфигурации котнвертера значений $this->row = $this->convert($this->row); // обрежем массив к первой значимой колонке if ( $this->first_column ) { $this->row = array_slice($this->row, $this->first_column); } } protected function setKeysFromHeader(){ if ( $this->has_header_row ) { // в файле есть заголовок, но он еще не назначен - назначим if ($this->keys === NULL) { $this->keys = array_values( $this->row ); return true; } } return false; } protected function filterRow(){ // если есть заголовок - все значения нужны, не фильтруем if ( $this->has_header_row || $this->row === NULL ) { return; } $this->row = array_filter( $this->row, function($val){ return !$this->isEmptyColumn($val); }); } protected function isLastLine(){ if ( ( $this->last_line ) && ( $this->current_row_number > $this->last_line ) ) { return true; } return false; } }