Как создать многомерный массив из иерархически хранимых данных SQL, используя метод списка смежности?

StackOverflow https://stackoverflow.com/questions/1273972

Вопрос

Иерархические данные из 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 скудна, но она предоставляет несколько хороших проходимых структур, интерфейсов и классов.В Интернете есть несколько хороших руководств по этому поводу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top