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

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
26 апр. 2024, в 06:46
1500 руб./в час
26 апр. 2024, в 05:31
1000 руб./за проект