首页 > 解决方案 > PHP:从 $x-deep 多维数组递归创建二维数组

问题描述

为了创建 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 层)多维数组:

[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;
    }
}

标签: phparraysrecursionphpexcel

解决方案


推荐阅读