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

时间:2014-08-07 21:24:44

标签: php arrays sorting multidimensional-array

我发现这个代码用于排序:

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

这对一个级别有好处。我有类似的东西:

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(

     )
 )

 )

数组可以在每个级别中具有任何深度和任意数量的元素。我需要使用上面的代码按键'order'对每个深度级别(aaa,bbb,ccc等)进行排序。

2 个答案:

答案 0 :(得分:1)

你需要递归地

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

此代码将迭代给定的数组,并且对于作为数组的每个值,使用该值调用自身。结果是将为结构中的每个数组调用usort

您可以像调用usort一样调用该函数:

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

答案 1 :(得分:1)

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');

}

经过多次尝试,我有了这个。有用。键(subs)的名称是硬编码的,但不是很好,但是......我很高兴它有效。