简体   繁体   English

如何按键对多维数组的所有级别进行排序?

[英]How to sort all levels of multidimensional array by key?

I found this code for sorting: 我找到了以下代码进行排序:

usort($array, function($a, $b) {
    return $a['order_inside_level'] - $b['order_inside_level'];
});

It's good for one level. 有益于一级。 I have something like that: 我有这样的事情:

array(
 array(
     'level'=>'aaa',
     'order'='1',
     'subs'=>array(
         array(
             'level'=>'bbb',
             'order'='1',
             'subs'=>array(
                 array(
                     'level'=>'ccc',
                     'order'='1',
                     'subs'=>array(
                         array(
                             'level'=>'ddd',
                             'order'='1',
                             'subs'=>array(
                                 ...
                             )
                         )
                     )
                 )
                 ,
                 array(
                     'level'=>'ccc',
                     'order'='2',
                     'subs'=>array(

                     )
                 )
             ),
         array(
             'level'=>'bbb',
             'order'='2'
         ),
         array(
             'level'=>'bbb',
             'order'='3'
         )
         )
     )
 ),
 array(
     'level'=>'aaa',
     'order'='2',
     'subs'=>array(

     )
 )

 )

Array may have any depth and any number of elements in each level. 数组在每个级别中可以具有任意深度和任意数量的元素。 I need to sort each level of depth (aaa,bbb,ccc, etc) using the code above by key 'order'. 我需要按键“ order”使用上面的代码对每个深度级别(aaa,bbb,ccc等)进行排序。

You will need to do this recursively . 您将需要递归执行此操作。

recursive_sort($arr, $func) {
    foreach ($arr as $key => $val) {
        if (is_array($val)) {
            recursive_sort($val, $func);
        }
    }
    usort($arr, $func);
}

This code will iterate over the given array, and for each value that is an array, call itself with the value. 这段代码将遍历给定的数组,对于作为数组的每个值,使用该值进行调用。 The result is that usort will be called for every array within the structure. 结果是将对结构中的每个数组调用usort

You would call the function the same as you would usort : 您将调用函数与使用usort相同:

recursive_sort($array, function($a, $b) {
    return $a['order_inside_level'] - $b['order_inside_level'];
});
function recursive_sort(&$arr) {
            fs($arr);
        foreach($arr as $k=> &$v){
            if (isset($v['subs'])) {
                 recursive_sort($v['subs']);
             }
        }
}


function sortByOrder($a, $b) {
    return $a['order_inside_level'] - $b['order_inside_level'];
}

function fs(&$array){

    usort($array, 'sortByOrder');

}

After multiple tries I have this. 经过多次尝试,我有这个。 It works. 有用。 Name of key (subs) is hardcoded what is not so good, but... I am glad it works. 键(子)的名称是硬编码的,虽然不好,但是...我很高兴它能起作用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM