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

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

Похожие вопросы