Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 需要迭代器建议来遍历树吗_Php_Iterator_Spl - Fatal编程技术网

Php 需要迭代器建议来遍历树吗

Php 需要迭代器建议来遍历树吗,php,iterator,spl,Php,Iterator,Spl,嗨,我需要一些迭代器建议 我有一个Category对象,它可以包含项目集合,也可以有子类别 从ORM中,我得到了一组类别对象。现在我想遍历这个集合并展平类别树结构。因此,子类别与父类别处于同一级别。我也想过滤一下孩子们 也许有人能给我指出正确的方向,目前在迭代器云中有些迷失 <?php class Category { private $name; private $children; private $type; private $parent;

嗨,我需要一些迭代器建议

我有一个Category对象,它可以包含项目集合,也可以有子类别

从ORM中,我得到了一组类别对象。现在我想遍历这个集合并展平类别树结构。因此,子类别与父类别处于同一级别。我也想过滤一下孩子们

也许有人能给我指出正确的方向,目前在迭代器云中有些迷失

<?php

class Category
{
    private $name;

    private $children;

    private $type;

    private $parent;

    private $items;

    //parent category
    public function getParent()
    {
        return $this->parent;
    }

    public function setItems($items)
    {
        $this->items = $items;
    }


    public function getItems()
    {
        return $this->items;
    }

    //colelction of categories
    public function getChildren()
    {
        return $this->children;
    }
}

必须从根节点和每个
$this->getChildren()
(节点和子节点(以及它们的子节点(以及它们的子节点))开始)(递归),直到它为
null
。这将导致如下结果:

(Start)
Root node
-> 1st Child node
--> Grandchild node
-> 2nd Child node
-> 3rd Child node
-> 4th Child node
--> Grandhild node
(No more children so exit)

您必须从根节点和每个
$this->getChildren()
(节点和子节点(及其子节点(及其子节点))开始)(递归),直到它为
null
。这将导致如下结果:

(Start)
Root node
-> 1st Child node
--> Grandchild node
-> 2nd Child node
-> 3rd Child node
-> 4th Child node
--> Grandhild node
(No more children so exit)

您只需要实现接口。然后,您可以使用混凝土对其进行迭代

为了帮助你理解

递归迭代器本身不是非常,嗯,“递归的”。它只是提供了一些可以用来获取子对象的方法(递归中的子问题可以被认为是“子对象”)。请注意,
RecursiveIterator.getChildren
()必须以另一个
RecursiveIterator
的形式返回其子项

您可以手动迭代一个普通的递归迭代器,但是,跟踪对
getChildren
的递归调用返回的所有子迭代器,并保持适当的深度等等,这将是非常痛苦的……这就是
递归迭代器
的作用所在

递归迭代器(RecursiveIteratorIterator)
是进行实际工作来系统地遍历结构,模仿递归的东西。它通过递归迭代器进行迭代,就像它是一个平面列表一样,但是在列表中的每个元素上,它都测试当前元素是否存在子元素。如果它
有子迭代器
,则调用
getChildren
,并将对该新子迭代器的引用存储在堆栈中。它以提供预期递归行为的方式管理堆栈(与手动将递归函数转换为迭代版本的方式大致相同)

明确地说,您不需要编写自己的
recursiveiterator
,只需实例化php的具体实现。这个类的存在纯粹是为了隐藏复杂性和管理在遍历过程中从您那里实例化的所有
RecursiveIterator
对象,并将遍历的结果显示为一个简单的列表<代码>递归迭代器在内部是一个非常复杂的类

至于过滤-

有几种方法。为了便于使用,我建议您使用PHP5.4。否则,您必须扩展

但是,在递归结构的视图被展平为类似列表的结构之后,这两种方法都会过滤掉元素。因此,您的过滤器不能说“跳过整个子树”,它只能说“跳过单个元素”。如果您需要说“跳过整个子树”,如果您没有PHP5.4,您需要使用或扩展它

你可能想从

class RecursiveCategoryIterator implements RecursiveIterator {...

它应该包含一个类别对象列表。

您只需实现该接口即可。然后,您可以使用混凝土对其进行迭代

为了帮助你理解

递归迭代器本身不是非常,嗯,“递归的”。它只是提供了一些可以用来获取子对象的方法(递归中的子问题可以被认为是“子对象”)。请注意,
RecursiveIterator.getChildren
()必须以另一个
RecursiveIterator
的形式返回其子项

您可以手动迭代一个普通的递归迭代器,但是,跟踪对
getChildren
的递归调用返回的所有子迭代器,并保持适当的深度等等,这将是非常痛苦的……这就是
递归迭代器
的作用所在

递归迭代器(RecursiveIteratorIterator)是进行实际工作来系统地遍历结构,模仿递归的东西。它通过递归迭代器进行迭代,就像它是一个平面列表一样,但是在列表中的每个元素上,它都测试当前元素是否存在子元素。如果它
有子迭代器
,则调用
getChildren
,并将对该新子迭代器的引用存储在堆栈中。它以提供预期递归行为的方式管理堆栈(与手动将递归函数转换为迭代版本的方式大致相同)

明确地说,您不需要编写自己的
recursiveiterator
,只需实例化php的具体实现。这个类的存在纯粹是为了隐藏复杂性和管理在遍历过程中从您那里实例化的所有
RecursiveIterator
对象,并将遍历的结果显示为一个简单的列表<代码>递归迭代器在内部是一个非常复杂的类

至于过滤-

有几种方法。为了便于使用,我建议您使用PHP5.4。否则,您必须扩展

但是,在递归结构的视图被展平为类似列表的结构之后,这两种方法都会过滤掉元素。因此,您的过滤器不能说“跳过整个子树”,它只能说“跳过单个元素”。如果您需要说“跳过整个子树”,如果您没有PHP5.4,您需要使用或扩展它

你可能想