Сортировка невложенного массива данных из модели смежности

У меня есть массив данных, извлеченных из таблицы базы данных, которая использует модель смежности для построения иерархии тем. Каждая запись содержит следующие поля:

  • 'id' - уникальный идентификатор ИИ.
  • 'name' - отображаемое имя.
  • 'parent_id' - идентификатор родительской темы (может быть нулевым для корневых тем)

Массив поступает из базы данных без вложенности и сортируется по идентификатору, как и следовало ожидать. Поле «id» является случайным и произвольным, и на него нельзя полагаться для создания полезного порядка. Я ищу способ отсортировать массив с использованием parent_id, чтобы он находился в правильном порядке смежности, но без вложения конечного результата в подмассивы. Список будет выглядеть следующим образом:

  • Корневая тема
  • ATopic1
  • ATopic2
  • Child1ofATopic2
  • Child2ofATopic2
  • ATopic3
  • Корневая темаB
  • BTopic1
  • BTopic2
  • и Т. Д.

Любая помощь или указатель на пример (даже на другом языке) будут высоко оценены.


person ShaunUK    schedule 19.03.2013    source источник
comment
Какая у вас структура массива? Я понимаю, что приведенный выше список является вашим желаемым результатом, но каков ввод?   -  person Voitcus    schedule 19.03.2013
comment
это массив записей из базы данных array(array(id=›1,name=›RootTopicA,parent_id=›null),array(id=›2,name=›ATopic1, parent_id=›1)) и т. д.   -  person ShaunUK    schedule 19.03.2013


Ответы (1)


Вы можете добавить поле, например sort, в котором вы будете хранить порядок одинаковых идентификаторов в категории.

Другое решение состоит в том, чтобы отсортировать их (в SQL) по ORDER BY parent_id, id или объединить два, ORDER BY sort, используя JOIN, например (не проверено):

SELECT object.id, object.sort, parent.id, parent.sort
FROM objects AS object
LEFT JOIN objects AS parent ON object.parent=parent.id
ORDER BY parent.sort, object.sort;

предполагая, что objects - это имя вашей таблицы, та же таблица object является основным объектом, а parent - объектом, который является его родителем (он нужен вам для получения sort родителя).

person Voitcus    schedule 19.03.2013
comment
К сожалению, я не думаю, что это то, что я искал. В столбце parent_id должно быть достаточно информации, чтобы упорядочить данные по родительским, дочерним и дочерним элементам без дополнительного столбца сортировки. Окончательный порядок не имеет значения (может быть в алфавитном порядке или по идентификатору), если каждый родитель имеет свои дочерние элементы под ним. В идеале я хотел бы работать с массивом, а не с запросами, чтобы я мог обернуть его в класс/функцию для использования в другом месте. - person ShaunUK; 19.03.2013
comment
Если бы мне пришлось сортировать по parent_id, я бы получил такой список, как RootTopicA, RootTopicB, Atopic1, Atopic2, Atopic3, Btopic1, Btopic2, child1ofatopic2, child2ofatopic2. - person ShaunUK; 19.03.2013