将树状对象结构转换为数组并整合整个事物

时间:2010-07-21 16:27:20

标签: php oop loops smarty

我有一个类似于树的对象结构,它由两种类型的对象组成:

  1. 班级Category的对象
  2. 班级CategoryLink的对象
  3. 结构如下:

    整个故事以Categories的数组开头,没有parent 每个Category都有一些不重要的属性和一些重要的属性:
    $parent - 包含父级Category的ID,
    $children - 包含一个childern Categories数组(如果类别当然没有childern,则可能为空)。
    $links - 包含CategoryLinks(也可能为空)的数组

    __constructing Category时,我会查找现有的子CategoriesCategoryLinks,如果有的话,我会创建他们的实例并将其添加到{{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可能只包含它们的一维数组,因此迭代它们是相当的很简单,我只是不确定如何迭代整个结构。

    什么是最好的正确的方法吗?

2 个答案:

答案 0 :(得分:3)

树木适合非常优雅的递归操作。在这种情况下,您将描述深度优先的预订遍历。 Wikipedia page可能有用。至于其余部分,将它推入一个多维阵列听起来是合理的,如果这是你显示它的最简单方法。

答案 1 :(得分:2)

即使我不是SPL的天才,但我认为你可以这样做:

实施RecursiveIterator。然后做:

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

正如我所说,我从未与SPL合作,但我确信你可以做这样的事情。那么,为什么不给它机会呢?

关于这一点的好处:如果Smarty有一个foreach循环,那么它也会很聪明。