Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何按键对多维数组的所有级别进行排序?_Php_Arrays_Sorting_Multidimensional Array - Fatal编程技术网

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

Php 如何按键对多维数组的所有级别进行排序?,php,arrays,sorting,multidimensional-array,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'

我找到了用于排序的代码:

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等)进行排序。

您需要递归地执行此操作

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

调用函数的方式与调用usort的方式相同:

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

经过多次尝试,我有这个。它起作用了。密钥(SUB)的名称是硬编码的,不太好,但。。。我很高兴它能工作。

为什么您真的需要对它进行排序?我正在编写菜单生成器。菜单从这样的数组中生成。每个级别的顺序都很重要。在我的示例中有数组的数组[array(0=>array(),1=>array(),…])。它们是数组。这意味着它们将按“顺序”排序,但它们没有键“顺序”(它们不是关联数组,它们只有数字索引),这可能就是“非法字符串偏移量”的原因?…我无法使usort在函数内部工作:函数fs($array){return usort($array,'sortByOrder');};fs($myarray);-不起作用。如果没有函数,它可以工作:usort($myarray,'sortByOrder');这怎么可能下面是一个例子。Usort在函数内部不起作用。它在函数外部工作(取消注释95字符串)。所以你的代码不能工作…我已经决定了函数内部工作的问题。现在排序只在数组的第一级进行-
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');

}