Рекурсивный порядок многомерного массива на каждом уровне в PHP - PullRequest
13 голосов
/ 21 декабря 2010

У меня есть массив этой формы:

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 ]

23 голосов
/ 21 декабря 2010

Используйте рекурсивную функцию:

// 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);
}
4 голосов
/ 30 марта 2016
function ksort_recursive(&$array)
{
    if (is_array($array)) {
        ksort($array);
        array_walk($array, 'ksort_recursive');
    }
}

Как отмечается в их комментариях, ответы с return ksort() неверны, так как ksort () возвращает bool успеха.

Обратите внимание, что эта функция не выдает «Предупреждение: ksort () ожидает, что параметр 1 будет массивом», если он не массив - это соответствует моим требованиям, но возможно не вашим.

4 голосов
/ 21 декабря 2010

Вам нужно использовать ksort .

// Not tested ...    
function recursive_ksort(&$array) {
    foreach ($array as $k => &$v) {
        if (is_array($v)) {
            recursive_ksort($v);
        }
    }
    return ksort($array);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...