我有一个类似于树的对象结构,它由两种类型的对象组成:
Category
的对象CategoryLink
的对象结构如下:
整个故事以Categories
的数组开头,没有parent
每个Category
都有一些不重要的属性和一些重要的属性:
$parent
- 包含父级Category
的ID,
$children
- 包含一个childern Categories
数组(如果类别当然没有childern,则可能为空)。
$links
- 包含CategoryLinks
(也可能为空)的数组
__constructing
Category
时,我会查找现有的子Categories
和CategoryLinks
,如果有的话,我会创建他们的实例并将其添加到{{1} }}和$children
,所以这个程序会重复给孩子们及其子女等等,直到达到没有孩子的类别为止。
所以这个程序的作用是它基本上创建了一个$links
树和它们的Categories
树。这很顺利,直到我想输出这个树结构(使用Links
),我不太确定如何以正确的方式迭代它。期望的输出是这样的
Smarty
我不确定在PHP中迭代它是否更好并将其转换为多维数组并在Smarty中迭代它,或者在Smarty中完成它。
* 请注意,我没有提及类Parent1 -its unimportant properties
-Child1 - its unimportant properties
-Child2 -...
-Child2's Child1
-Child2's Child2
-Child3
Parent2
-Child1
-Child1's Child1
-Child2
Parent3
...
的对象,因为CategoryLink
可能只包含它们的一维数组,因此迭代它们是相当的很简单,我只是不确定如何迭代整个结构。
什么是最好的正确的方法吗?
答案 0 :(得分:3)
树木适合非常优雅的递归操作。在这种情况下,您将描述深度优先的预订遍历。 Wikipedia page可能有用。至于其余部分,将它推入一个多维阵列听起来是合理的,如果这是你显示它的最简单方法。
答案 1 :(得分:2)
即使我不是SPL的天才,但我认为你可以这样做:
实施RecursiveIterator。然后做:
$iterator = new RecursiveIteratorIterator(
$theMostTopParent
);
foreach ($iterator as $category) {
// your code
}
正如我所说,我从未与SPL合作,但我确信你可以做这样的事情。那么,为什么不给它机会呢?
关于这一点的好处:如果Smarty有一个foreach循环,那么它也会很聪明。