Как отсортировать вложенные массивы PHP

Друзья добрый вечер. Делаю вывод древовидных комментариев с помощью Adjacency List (parent_id), вроде бы все хорошо, сделал массив, отсортировал с помощью:

function build_tree($data){
   $tree = array();
   foreach($data as $id => &$row){
      if(empty($row['parent_id']))
            $tree[$id] = &$row;
      else
         $data[$row['parent_id']]['children'][$id] = &$row;
   }
   return $tree;
}

В итоге получаю массив в котором правильно с точки зрения вложенности отсортированы комментарии, но вот id у вложенных комментариев отсортированы также по убыванию, а нужно по возрастанию. И никак не могу придумать как это сделать. Помогите пожалуйста.

Пример массива:

Array
(
    [2] => Array
        (
            [id] => 2
            [parent_id] => 0
            [name] => Одеся
            [content] => Тестовый коммент номер 2!!!
            [children] => Array
                (
                    [18] => Array
                        (
                            [id] => 18
                            [parent_id] => 2
                            [name] => Лева2
                            [content] => Одеся, Вложенный комментарий 2
                        )

                    [4] => Array
                        (
                            [id] => 4
                            [parent_id] => 2
                            [name] => Иван
                            [content] => Одеся, вложенный коммент номер 1
                            [children] => Array
                                (
                                    [20] => Array
                                        (
                                            [id] => 20
                                            [parent_id] => 4
                                            [name] => Леха
                                            [content] => Иван, Третий уровень вложенности номер 2
                                        )

                                    [19] => Array
                                        (
                                            [id] => 19
                                            [parent_id] => 4
                                            [name] => Дима3
                                            [content] => Иван, третий уровень вложенности
                                        )

                                )

                        )

                )

        )

    [1] => Array
        (
            [id] => 1
            [parent_id] => 0
            [name] => Дмитрий
            [content] => Тестовый коммент номер 1!!!
        )

)

UPDATE Все оказалось на столько просто... Просто нужно создать сразу массив в ASC и уже через krsort() отсортировать в DESC (обратном порядке) ключи первого уровня. Вложенные массивы останутся в ASC.


Ответы (1 шт):

Автор решения: Макс Максимус

Для решения написал рекурсивную функцию с использованием функции ksort для сортировки массива по ключам по возрастанию. Функция должна обязательно принимать массив по ссылке, иначе не будет работать. При каждом рекурсивном вызове проходим каждый вложенный массив и проверяем его на наличие ['children']. Если такого ключа нет, значит сортировать не нужно, иначе - вызываем функцию уже для вложенного массива.

function mySort(array &$arr)
{
    ksort($arr);
    foreach ($arr as $k => &$v) {
        if(isset($v['children'])){
            mySort($v['children']);
        }
    }
}
// вызываем
mySort($arr);
// проверяем результат
print_r( $arr );

Array
(
    [1] => Array
        (
            [id] => 1
            [parent_id] => 0
            [name] => Дмитрий
            [content] => Тестовый коммент номер 1!!!
        )

    [2] => Array
        (
            [id] => 2
            [parent_id] => 0
            [name] => Одеся
            [content] => Тестовый коммент номер 2!!!
            [children] => Array
                (
                    [4] => Array
                        (
                            [id] => 4
                            [parent_id] => 2
                            [name] => Иван
                            [content] => Одеся, вложенный коммент номер 1
                            [children] => Array
                                (
                                    [19] => Array
                                        (
                                            [id] => 19
                                            [parent_id] => 4
                                            [name] => Дима3
                                            [content] => Иван, третий уровень вложенности
                                        )

                                    [20] => Array
                                        (
                                            [id] => 20
                                            [parent_id] => 4
                                            [name] => Леха
                                            [content] => Иван, Третий уровень вложенности номер 2
                                        )

                                )

                        )

                    [18] => Array
                        (
                            [id] => 18
                            [parent_id] => 2
                            [name] => Лева2
                            [content] => Одеся, Вложенный комментарий 2
                        )

                )

        )

)
→ Ссылка