Преобразование древовидной структуры объекта в массив и целое - PullRequest
3 голосов
/ 21 июля 2010

У меня есть древовидная структура объектов, состоящая из двух типов объектов:

  1. объект класса Category
  2. объект класса CategoryLink

Структура выглядит следующим образом:

Вся история начинается с массива Categories, в котором нет parent Каждый Category имеет несколько неважных свойств и несколько важных:$parent - содержит идентификатор родителя Category,$children - содержать в массиве детей Categories (может быть пустым, если в категории, конечно, нет детей).$links - содержащий массив CategoryLinks (также возможно пустой)

Пока __constructing a Category, я ищу существующие дочерние элементы Categories и CategoryLinks, и если они есть, я создаю их экземпляры и добавляю их в $children и $linksпоэтому эта процедура повторяется для детей и их детей и так далее, пока не будет достигнута категория без детей.

Так что эта процедура делает то, что она в основном создает дерево Categories и их Links.Это идет достаточно хорошо, пока я не хочу выводить эту древовидную структуру (используя Smarty), и я не совсем уверен, как правильно выполнить итерацию по ней.Желаемый вывод - что-то вроде этого

Parent1 -its unimportant properties
    -Child1 - its unimportant properties
    -Child2 -...
        -Child2's Child1
        -Child2's Child2
    -Child3
Parent2
    -Child1
        -Child1's Child1
    -Child2
Parent3
...

Я не уверен, что лучше перебрать его в PHP и преобразовать в многомерный массив и перебрать в Smarty, или сделать все этопуть в Смарти.

* обратите внимание, что я не упомянул объекты класса CategoryLink, поскольку Category может содержать только одномерный массив из них, поэтому итерации по ним довольно просты,Я просто не знаю, как перебирать всю структуру.

Что лучше |правильный способ сделать это?

Ответы [ 2 ]

3 голосов
/ 21 июля 2010

Деревья поддаются очень элегантным рекурсивным операциям.В этом случае вы описываете обход предварительного заказа в глубину.Страница Википедии может быть полезной.В остальном, вставка его в многомерный массив звучит достаточно разумно, если для вас это самый простой способ отобразить его.

2 голосов
/ 21 июля 2010

Несмотря на то, что я не гений SPL, но я думаю, вы могли бы сделать что-то вроде этого:

Реализация RecursiveIterator . А затем сделайте:

$iterator = new RecursiveIteratorIterator(
    $theMostTopParent
);
foreach ($iterator as $category) {
     // your code
}

Как я уже говорил, я никогда не работал с SPL, но я действительно уверен, что вы можете сделать что-то подобное. Так почему бы не дать ему шанс?

Хорошая вещь об этом: если у Smarty есть цикл foreach, это тоже будет работать в smarty.

...