Как отсортировать вложенные массивы 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
)
)
)
)