Задать вопрос
megakor
@megakor
Go/PHP developer | ВКонтакте

Как отсортировать коллекцию по иерархии с помощью sort()?

У меня есть коллекция со следующими данными.

id | name | parent_id

1  | Category2 | null
2  | Element1   | 2
3  | Element3   | 1
4  | Category1 | null
5  | Element4   | 2
6  | Element1   | 1


Я хочу отсортировать так, чтобы сначала шла родительская, а потом за ней шли дочерние категории. Результат мне нужен примерно такой:

id | name | parent_id

1  | Category1 | null
3  | Element3   | 1
6  | Element1   | 1
4  | Category2 | null
5  | Element4   | 2
2  | Element1   | 2


Не получается написать callback функцию для метода sort (код ниже не работает):

$collection->sort(function (self $a, self $b) {
    if (is_null($a->parent_id)) {
        if (is_null($b->parent_id)) {
            return $a->id > $b->id ? 1 : -1;
        }

        if ($a->id === $b->parent_id) {
            return 1;
        }

        return $a->id < $b->parent_id ? 1 : -1;
    }

    if ($a->parent_id === $b->parent_id) {
        return $a->id > $b->id;
    }

    return $a->parent_id > $b->parent_id ? 1 : -1;
})
  • Вопрос задан
  • 74 просмотра
Подписаться 1 Средний 1 комментарий
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
ну и сортируй тогда по parent_id, а если он совпадает, то по id (это я уже предполагаю т.к. в вопросе этот момент не озвучен).
забыл упомянуть: при такой структуре бд, за один проход такую сортировку, увы, не реализовать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽