提问人:TheTom 提问时间:1/19/2023 最后编辑:mickmackusaTheTom 更新时间:1/19/2023 访问量:51
按列递归地对未知深度的多维数组中的级别进行排序,同时保留键
Recursively sort levels within a multidimensional array of unknown depth by a column while preserving keys
问:
为了对现有的多维数组进行排序,我尝试使用 usort,但它不会给我带来任何结果。由于给定的结构,我不能使用嵌套集或类似的东西,因此我必须对其进行排序:
我的阵列:
[
2 => [
'position' => 0,
'children' => [
3 => ['position' => "375"],
5 => ['position' => "44"],
6 => ['position' => "567"],
9 => [
'position' => "12",
'children' => [
74 => ['position' => "2"],
76 => ['position' => "3"],
77 => ['position' => "1"],
]
],
62 => ['position' => "34"],
63 => ['position' => "11"],
66 => ['position' => "114"],
74 => ['position' => "912"],
76 => ['position' => "4564"],
]
]
]
我想按名为“children”的节点对每个级别进行排序。递归应该没有问题。它可以是一个变量结构,其中节点“子节点”可以存在......或不:)
按列值排序后的所需结果:position
[
2 => [
'position' => 0,
'children' => [
63 => ['position' => "11"],
9 => [
'position' => "12",
'children' => [
77 => ['position' => "1"],
74 => ['position' => "2"],
76 => ['position' => "3"],
]
],
62 => ['position' => "34"],
5 => ['position' => "44"],
66 => ['position' => "114"],
3 => ['position' => "375"],
6 => ['position' => "567"],
74 => ['position' => "912"],
76 => ['position' => "4564"],
]
]
]
我尝试了以下代码,但没有成功:
public function recur($data){
// ...
foreach($data as $key=>$value){
if (array_key_exists('children', $value)) {
usort($value, function ($a, $b): int {
if ($a['position'] === $b['position']) {
// ....
}
return $a['position'] <=> $b['position'];
});
}
}
}
答:
1赞
mickmackusa
1/19/2023
#1
您的代码不返回任何数据,因此我们必须假设您的意图是通过引用进行修改。若要在递归方法中通过引用实现修改,请在方法的参数签名中使用符号和 .&
$value
foreach()
需要在循环外部对列数据进行键保留排序,以便正确访问数据。position
对当前行进行排序后,可以递归循环访问包含数据的任何子集。children
代码:(演示)
function recur(&$data): void
{
uasort($data, fn($a, $b) => $a['position'] <=> $b['position']);
foreach($data as &$value){
if (isset($value['children'])) {
recur($value['children']);
}
}
}
recur($array);
var_export($array);
评论
1赞
TheTom
1/19/2023
首先,感谢您为回答我的问题而投入的时间和工作!我接受你的解决方案既出色又简单。谢谢。它不适用于 php 7.4 <但出于 DDEV 的原因,这不是一个真正的问题。 感谢您提供此解决方案
0赞
mickmackusa
1/19/2023
这一直工作到PHP7.0,也就是宇宙飞船操作员诞生的时候。
评论