在PHP中的每个级别递归地排序多维数组

4v4*_*n42 13 php arrays sorting recursion multidimensional-array

我有一个这种形式的数组:

Array
(
    [first_level] => Array
        (
            [dir_3] => Array
                (
                    [subdir_1] => Array
                        (
                            [file_2.mp4] => stdClass Object
                                (
                                    [name] => file_2.mp4
                                )

                            [file_1.mp4] => stdClass Object
                                (
                                    [name] => file_1.mp4
                                )

                        )
                )
            [dir_1] => Array
                (
                    [subdir_2] => Array
                        (
                            [file_6.mp4] => stdClass Object
                                (
                                    [name] => file_6.mp4
                                )
                            [file_9.mp4] => stdClass Object
                                (
                                    [name] => file_9.mp4
                                )
                            [file_7.mp4] => stdClass Object
                                (
                                    [name] => file_7.mp4
                                )
                        )
                    [subdir_1] => Array
                        (
                            [file_8] => stdClass Object
                                (
                                    [name] => file_8.mp4
                                )

                        )
        )
    )
)
Run Code Online (Sandbox Code Playgroud)

我需要这样订购:

Array
(
    [first_level] => Array
        (
            [dir_1] => Array
                (
                    [subdir_1] => Array
                        (
                            [file_8] => stdClass Object
                                (
                                    [name] => file_8.mp4
                                )
                        )
                    [subdir_2] => Array
                        (
                            [file_6.mp4] => stdClass Object
                                (
                                    [name] => file_6.mp4
                                )
                            [file_7.mp4] => stdClass Object
                                (
                                    [name] => file_7.mp4
                                )
                            [file_9.mp4] => stdClass Object
                                (
                                    [name] => file_9.mp4
                                )
                        )
        )
        [dir_3] => Array
                (
                    [subdir_1] => Array
                        (
                            [file_1.mp4] => stdClass Object
                                (
                                    [name] => file_1.mp4
                                )

                            [file_2.mp4] => stdClass Object
                                (
                                    [name] => file_2.mp4
                                )

                        )
                )
    )
)
Run Code Online (Sandbox Code Playgroud)

我浏览了其他类似的问题,我一直试图用usort解决它,但我无法理解它.:S

任何的想法?

net*_*der 23

使用递归函数:

// Note this method returns a boolean and not the array
function recur_ksort(&$array) {
   foreach ($array as &$value) {
      if (is_array($value)) recur_ksort($value);
   }
   return ksort($array);
}
Run Code Online (Sandbox Code Playgroud)

  • 有些人现在可能没有,所以值得一提的是ksort(以及asort和类似函数)修改原始数组,而不是返回它的排序副本,它们返回一个布尔值.因此,此函数将返回布尔值而不是数组本身. (3认同)
  • 这个答案让我在自己的代码中发现了一个愚蠢的错误.:o我自己想出了一些非常相似的代码,但是我忘记了`&`之前的'&$ value`,所以我很难理解为什么只有我的第一级才被排序.谢谢你在不知不觉中帮助我.;) (2认同)

Vin*_*rat 5

您需要将ksort与递归一起使用。演示

function recursive_ksort(&$array) {
    foreach ($array as &$v) {
        if (is_array($v)) {
            recursive_ksort($v);
        }
    }
    ksort($array);
}

recursive_ksort($array);
var_export($array);
Run Code Online (Sandbox Code Playgroud)