【问题标题】:How to sort all levels of multidimensional array by key?如何按键对所有级别的多维数组进行排序?
【发布时间】:2014-08-07 21:24:44
【问题描述】:

我找到了这个排序代码:

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(

     )
 )

 )

数组在每一层中可以有任意深度和任意数量的元素。我需要使用上面的代码按“顺序”键对每个深度级别(aaa、bbb、ccc 等)进行排序。

【问题讨论】:

  • 为什么实际上需要对其进行排序?
  • 我正在编写菜单生成器。菜单从这样的数组生成。每个级别的顺序都很重要。

标签: php arrays sorting multidimensional-array


【解决方案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'];
});

【讨论】:

  • 在我的示例中有数组数组 [array(0=>array(),1=>array(),...)]。它们是数组。这意味着它们将按“顺序”排序,但它们没有键“顺序”(它们不是关联数组,它们只有数字索引)这可能是“非法字符串偏移”的原因吗?..
  • 我不能让 usort 在函数内部工作:function fs($array){ return usort($array, 'sortByOrder');}; fs($myarray); - 不工作。没有功能它可以工作: usort($myarray, 'sortByOrder');这怎么可能?..
  • sandbox.onlinephpfunctions.com/code/… - 这是示例。 Usort 在函数内部不起作用。它在函数之外工作(取消注释 95 字符串)。这样你的代码也不起作用......
  • 我已经确定了函数内部工作的问题。现在排序只发生在数组的第一级 - sandbox.onlinephpfunctions.com/code/…
【解决方案2】:
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)的名称是硬编码的,不太好,但是......我很高兴它有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    相关资源
    最近更新 更多