Как создать многомерный массив из иерархически хранимых данных SQL, используя метод списка смежности?
-
16-09-2019 - |
Вопрос
Иерархические данные из SQL
Модель списка Смежности
В моей модели у меня есть ряд объектов, каждый из которых хранится со своим родительским идентификатором.Я использую модель списка смежности в качестве моего метода иерархии.
Все примеры списка смежности просто выводятся тут же.Никто не пытается создать многомерный массив из результирующего набора.
---------------
| id | parent |
---------------
| 1 | NULL |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 2 |
| 6 | 5 |
---------------
Объект
Я создал переменную массива в своем классе под названием 'children' и хочу добавлять дочерний объект каждый раз, когда нахожу дочерний объект из запроса к БД.
Создание массива внутри каждого объекта и хранение в нем последующих объектов кажется неправильным.Разве я не могу создать массив объектов отдельно?Выполнение этого таким образом может затруднить прохождение массива, когда я получу его в представление.
Мне кажется, что я неправильно подхожу к этой проблеме?
Есть ли более разумный способ использовать PHP-массивы, чем этот?
Решение
Массив дочерних элементов не обязательно должен быть частью класса;вы всегда можете просто создать специальное дерево, где один узел представляет собой хэш, содержащий объект и его дочерние элементы.Я не знаю PHP, но это выглядело бы примерно так:
{
object => $row1,
children => [
{
object => $row2,
children => [ ... ],
}, {
object => $row3,
children => [],
}
]
}
Другие советы
Вам нужно, чтобы это был массив?Вариантом могло бы быть, чтобы объекты реализовывали рекурсивную иерархическую структуру, подобную этой:
http://www.php.net /~helly/php/ext/spl/classRecursiveArrayIterator.html
Вы можете добавлять объекты как дочерние и по-прежнему перемещать структуру в виде массива.
Документация по SPL скудна, но она предоставляет несколько хороших проходимых структур, интерфейсов и классов.В Интернете есть несколько хороших руководств по этому поводу.