PHP: рекурсивное создание двумерного массива из многомерного массива $ x-deep - PullRequest
1 голос
/ 03 октября 2019

Чтобы создать отчет для 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;
    }
}

...