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

Posted

技术标签:

【中文标题】在PHP中的每个级别递归地对多维数组进行排序【英文标题】:Order multidimensional array recursively at each level in PHP 【发布时间】:2011-05-28 22:20:42 【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

【参考方案1】:

您需要使用ksort。

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

【讨论】:

这应该是公认的答案!以前回答过。【参考方案2】:

使用递归函数:

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

【讨论】:

当然!这很容易......因为我没有在现场看到它而感到羞耻:P 谢谢,就像一个魅力。 这个答案让我在自己的代码中发现了一个愚蠢的错误。 :o 我自己想出了一些非常相似的代码,但是我在&$value 之前忘记了&,所以我很头疼,为什么只有我的第一级得到排序。谢谢你在不知不觉中帮助了我。 ;) 有些人现在可能不会,所以值得一提的是,ksort(以及 asort 和类似函数)会修改原始数组,而不是返回它的排序副本,而是返回一个布尔值。因此,这个函数将返回一个布尔值而不是数组本身。 如其他答案和 cmets 中所述,ksort 是就地的,因此您不需要返回值。【参考方案3】:
function ksort_recursive(&$array)

    if (is_array($array)) 
        ksort($array);
        array_walk($array, 'ksort_recursive');
    

正如他们的 cmets 所述,return ksort() 的答案不正确,因为 ksort() 返回成功布尔值。

请注意,当给定非数组时,此函数不会抛出“警告:ksort() 期望参数 1 为数组” - 这符合我的要求,但可能不符合您的要求。

【讨论】:

以上是关于在PHP中的每个级别递归地对多维数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

php如何判断数组是一维还是多维

如何在 PHP 中对多维数组进行排序 [重复]

php判断多维数组的技巧

php无限极分类递归写入多维数组的方法

PHP array_multisort—对多个数组或多维数组进行排序

php 多个多维数组求交集