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

时间:2010-12-21 16:13:11

标签: php arrays recursion multidimensional-array sorting

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

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
                                )

                        )
        )
    )
)

我需要这样订购:

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
                                )

                        )
                )
    )
)

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

有什么想法吗?

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:4)

您需要使用ksort

// Not tested ...    
function recursive_ksort(&$array) {
    foreach ($array as $k => &$v) {
        if (is_array($v)) {
            recursive_ksort($v);
        }
    }
    return ksort($array);
}

答案 2 :(得分:4)

function ksort_recursive(&$array)
{
    if (is_array($array)) {
        ksort($array);
        array_walk($array, 'ksort_recursive');
    }
}

如他们的评论中所述,return ksort()的答案不正确,因为ksort()会返回成功的bool。

请注意,此函数不会抛出"警告:ksort()期望参数1为数组"当给出非数组时 - 这符合我的要求,但也许不符合你的要求。