megakor
@megakor
PHP погроммист | ru.sarvarov.dev

Как отсортировать коллекцию по иерархии с помощью 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;
})
  • Вопрос задан
  • 33 просмотра
Пригласить эксперта
Ответы на вопрос 1
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
ну и сортируй тогда по parent_id, а если он совпадает, то по id (это я уже предполагаю т.к. в вопросе этот момент не озвучен).
забыл упомянуть: при такой структуре бд, за один проход такую сортировку, увы, не реализовать.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
RecruitIT Москва
от 100 000 до 160 000 ₽
Simtech Development Санкт-Петербург
от 100 000 ₽
Директ Кредит Казань
от 70 000 до 120 000 ₽