在没有父ID的情况下,如何在PHP中使这个平面数组分层?
我有一个平面数组结构(在没有父ID的情况下,如何在PHP中使这个平面数组分层?,php,arrays,recursion,hierarchical-data,Php,Arrays,Recursion,Hierarchical Data,我有一个平面数组结构($rows)和一个列数组($groupByCols),我希望通过该数组对数据进行分组: $groupByCols = ['a', 'b']; $rows = [ [ 'a' => 1, 'b' => 10, 'c' => 100 ], [ 'a' => 1, 'b' => 20, 'c' => 200 ],
$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级
谢谢。此功能将满足您的需要。它遍历数组,按
$columns
中第一个值索引的值进行分组。如果$columns
数组中还有列,它将按这些列递归分组。为了避免出现奇数键,它调用array\u 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));
输出结果如您所愿,但与其把答案打印得太长,不如看演示。太好了,尼克。非常感谢。你知道,在我的一次尝试中,我实际上有一些非常接近的东西,我没有意识到我就快到了。我缺少的主要内容是引用数组的
&
。该死!不过再次谢谢你。救命恩人!是的,我知道怎么回事。很高兴我能帮忙。