Чтобы создать отчет для Excel, мне нужно создать двумерный массив:
[0] => Array (
[0] = Value A1
[1] = Value B1
[2] = Value C1a
[3] = Value C1b
)
[1] => Array (
[0] = Value A1
[1] = Value B1
[2] = Value C2a
[3] = Value C2b
)
[2] => Array (
[0] = Value A1
[1] = Value B1
[2] = Value C3a
[3] = Value C3b
)
[3] => Array (
[0] = Value A1
[1] = Value B2
[2] = Value C4a
[3] = Value C4b
)
[4] => Array (
[0] = Value A1
[1] = Value B2
[2] = Value C5a
[3] = Value C5b
) ...
Из многомерного массива $ x-deep (1-5 level):
[0] => Array (
[name] = Value A1
[data] => Array (
[0] => Array(
[name] = Value B1
[data] => Array (
[0] => Array (
[name] = Value C1a
[secondary] = Value C1b
)
[1] => Array (
[name] = Value C2a
[secondary] = Value C2b
)
[2] => Array (
[name] = Value C3a
[secondary] = Value C3b
)
)
)
[1] => Array(
[name] = Value B2
[data] => Array (
[1] => Array (
[name] = Value C4a
[secondary] = Value C4b
)
[2] => Array (
[name] = Value C5a
[secondary] = Value C5b
)
[3] => Array (
[name] = Value C6a
[secondary] = Value C6b
)
)
)
)
[1] => Array (
[name] = Value A2
[data] => Array (
[0] => Array(
[name] = Value B1
[data] => Array (
[0] => Array (
[name] = Value C1a
[secondary] = Value C1b
)
[1] => Array (
[name] = Value C2a
[secondary] = Value C2b
)
[2] => Array (
[name] = Value C3
[secondary] = Value C3b
)
)
)
[1] => Array(
[name] = Value B2
[data] => Array (
[1] => Array (
[name] = Value C4a
[secondary] = Value C4b
)
[2] => Array (
[name] = Value C5a
[secondary] = Value C5b
)
[3] => Array (
[name] = Value C6a
[secondary] = Value C6b
)
)
)
)
) ...
Когда рекурсивный вызов проверяет, заполнен ли [data]
, перед передачей этого массива данных в себя.
После нескольких попыток рекурсивного перебора массива (foreach (), RecursiveArrayIterator, array_walk () и т. Д.) Я не могу правильно построить необходимый массив после достижения конца «B1» ипереключение на «B2» - поскольку при итерации по «C» добавляется несколько элементов (1 или более), я получу массив, который выглядит примерно так:
[3] => Array (
[0] = Value A1
[1] = Value B1
[2] = Value B2
[3] = Value C4a
[4] = Value C4b
)
Мне было интересно,Кто угодно может указать мне правильное направление.
Приветствия!
РЕДАКТИРОВАТЬ:
Добавление кода в его нынешнем наполовину развитом-потянув за волосысостояние
<?php
class Report {
//
// Data processors and other functions snipped
//
public function flattenForExcel() {
$excelArray = [];
$index = 0;
$data = $this->getProcessedData();
foreach ($data as $datum) {
$excelArray = $this->recursivelyFlattenForExcel($datum, $excelArray, $index);
}
return $excelArray;
}
public function recursivelyFlattenForExcel($datum, $returnArray, &$index) {
$added = 0;
$showInExcel = $datum['config']['show_in_excel'];
foreach ($showInExcel as $showValue) {
$returnArray[$index][] = $datum[$showValue];
$added++;
}
$cloneArray = array_slice($returnArray[$index], 0, $added * -1);
if (!empty($datum['data'])) {
foreach ($datum['data'] as $moreDatum) {
$returnArray = $this->recursivelyFlattenForExcel($moreDatum, $returnArray, $index);
}
} else {
$index++;
}
$returnArray[$index] = $cloneArray;
return $returnArray;
}
}