如何在没有父ID的PHP中使此平面数组分层?

时间:2018-11-02 10:58:37

标签: php arrays recursion hierarchical-data

我有一个平面数组结构($rows)和一个列($groupByCols)数组,我想按以下方式对数据进行分组:

$groupByCols = ['a', 'b'];
$rows = [
    [
        'a' => 1,
        'b' => 10,
        'c' => 100
    ],
    [
        'a' => 1,
        'b' => 20,
        'c' => 200
    ],
    [
        'a' => 1,
        'b' => 20,
        'c' => 300
    ],
    [
        'a' => 1,
        'b' => 30,
        'c' => 400
    ],
    [
        'a' => 2,
        'b' => 40,
        'c' => 500
    ],
    [
        'a' => 2,
        'b' => 50,
        'c' => 600
    ],
    [
        'a' => 3,
        'b' => 60,
        'c' => 700
    ]
];

通过遍历$rows变量并依次引用每个$groupByCols值,我想获得以下层次结构数组:

$groupedRows = [
    [
        [
            [
                'a' => 1,
                'b' => 10,
                'c' => 100
            ]
        ],
        [
            [
                'a' => 1,
                'b' => 20,
                'c' => 200
            ],
            [
                'a' => 1,
                'b' => 20,
                'c' => 300
            ]
        ],
        [
            [
                'a' => 1,
                'b' => 30,
                'c' => 400
            ]
        ]
    ],
    [
        [
            [
                'a' => 2,
                'b' => 40,
                'c' => 500
            ]
        ],
        [
            [
                'a' => 2,
                'b' => 50,
                'c' => 600
            ]
        ]
    ],
    [
        [
            [
                'a' => 3,
                'b' => 60,
                'c' => 700
            ]
        ]
    ]
];

我有99%的把握要为此使用递归,但是在尝试了10种不同的东西(都没有用)之后,我不知道如何获得想要的东西。

通常,我会分享到目前为止已经编写的代码,但是经过几天的思考,却一无所获,我确实没有什么可展示的。

我想我只需要一些有关如何(假定)递归使用$groupByCols$rows变量来获取$groupedRows数组的一般指导。任何帮助将不胜感激。

此外,请注意,以上数据出于演示目的非常简单。实际数据可能更长且更复杂,根据要求的性质,我可能不得不使用$groupByCols降低5-6级。

谢谢。

1 个答案:

答案 0 :(得分:1)

此功能将执行您想要的操作。它遍历数组,并按$columns中第一个值索引的值进行分组。如果$columns数组中还有剩余的列,它将按这些列递归分组。为了避免使用奇数编号的键,它会调用array_values将结果重新索引为从0开始的数字键。

function group_by($array, $columns) {
    $new_arr = array();
    $column = array_shift($columns);
    foreach ($array as $arr) {
        $new_arr[$arr[$column]][] = $arr;
    }
    if (count($columns)) {
        foreach ($new_arr as &$arr) {
            $arr = group_by($arr, $columns);
        }
    }
    return array_values($new_arr);
}
print_r(group_by($rows, $groupByCols));

输出随心所欲,但不要使答案冗长而混乱,只需看3v4l.org上的演示即可。