按列递归地对未知深度的多维数组中的级别进行排序,同时保留键

Recursively sort levels within a multidimensional array of unknown depth by a column while preserving keys

提问人:TheTom 提问时间:1/19/2023 最后编辑:mickmackusaTheTom 更新时间:1/19/2023 访问量:51

问:

为了对现有的多维数组进行排序,我尝试使用 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'];
            });
        }
    }
}  
PHP 组递 维数组 usort

评论


答:

1赞 mickmackusa 1/19/2023 #1

您的代码不返回任何数据,因此我们必须假设您的意图是通过引用进行修改。若要在递归方法中通过引用实现修改,请在方法的参数签名中使用符号和 .&$valueforeach()

需要在循环外部对列数据进行键保留排序,以便正确访问数据。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,也就是宇宙飞船操作员诞生的时候。