PhpSpreadsheet: алгоритм, использующий вложенные циклы для заполнения электронной таблицы, никогда не достигает последней итерации самого внешнего цикла - PullRequest
0 голосов
/ 24 января 2020

Я использую PhpSpreadsheet для заполнения электронной таблицы с использованием многоуровневого ассоциативного массива, возвращенного в качестве набора результатов из запроса MySQL. Массив выглядит следующим образом:

callStats [
    [1]=>array[
        ['op']=>7558,
        ['option']=>'Claim',
        ['c']=>'7'
    ]
    [2]=>array[
        //Same structure at every index in outermost array
    ]
]

Я использую два отдельных массива для заполнения заголовков столбцов (с опцией) и идентификаторов строк столбцов (с опциями).

Что я хочу сделать, это Заполните матрицу, в которой каждая перестановка опций и опций заполняется с правильным счетом ('c'), представляющим количество раз, когда данный опер выбрал данную опцию.

Все работает нормально до последнего Строка возможных опций, в которой я использую l oop, переходит к следующему столбцу и начинает повторяться снова с самого начала, даже если в каждом столбце должна быть последняя строка. Пример электронной таблицы с отсутствующей нижней строкой в ​​каждом столбце

Код, который я использую для создания электронной таблицы и заполнения ячеек, выглядит следующим образом:

// Arrange operator columns
    $col = 'C';
    $row = 2;
    for($i=0;$i<=count($operatorResult)-1;$i++) {
        $this->sheet->getColumnDimension($col)->setAutoSize(true);
        $this->sheet->setCellValue($col.$row, $operatorResult[$i]['op']);
        $col++;
    }

    // Arrange options columns
    $optionsCol = 'B';
    $optionsRow = 3;
    for($i=0;$i<=count($optionsResult)-1;$i++) {
        $this->sheet->setCellValue($optionsCol.$optionsRow, $optionsResult[$i]['option']);
        $optionsRow++;
    }

    // Plot statistics matrix
    $letter = 'C';
    $columnCounter = 3;
    $rowCounter = 3;
    foreach($this->result as $data) {

            if($data['op'] === (string)$this->sheet->getCellByColumnAndRow($columnCounter, 2)->getValue()) {

                if ($data['option'] !== $this->sheet->getCellByColumnAndRow(2, $rowCounter)->getValue()) {
                    $this->sheet->setCellValue($letter.$rowCounter, '0');
                    $rowCounter++;
                }

                $this->sheet->setCellValue($letter.$rowCounter, $data['c']);
                $rowCounter++;

                // Move to the next column once you reach a blank cell in the options column
                if($this->sheet->getCellByColumnAndRow(2, ($rowCounter+1))->getValue() === null) {

                    // Move over a column
                    $letter++;
                    $columnCounter++;
                    // Go back to the first row of options
                    $rowCounter = 3;
                }
            }
    }

Моя проблема заключается в том, что Я не могу понять, как или почему алгоритм не будет заполнять итоговую строку параметров для соответствующих столбцов операций, т. Е. Самая нижняя строка не будет заполняться, когда это логически должно происходить.

Причина, по которой я не использовал встроенный PhpSpreadsheet -в функции fromArray () для построения матрицы, потому что fromArray () интерпретирует первый индекс каждого массива как заголовок столбца (если я правильно интерпретирую документацию), что я определенно не хочу. Это приведет к повторным заголовкам столбцов, поскольку один и тот же оператор появляется несколько раз в разных перестановках.

Заранее спасибо.

...