我有一个平面数组结构($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级。
谢谢。
答案 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上的演示即可。