1

我试图更好地理解 PHP 中的迭代器。对于这个测试,我想制作一个项目树,并以不同的RecursiveIteratorIterator模式列出它们。::SELF_FIRST 和 ::CHILD_FIRST 模式按我的预期工作。但是,当我想列出叶子时它不会。我在实现中一定缺少一些东西,它不允许该模式正常工作,因为它什么也没打印出来。我的Obj::hasChildren()方法有问题吗?

这是测试类:

class Obj implements \RecursiveIterator {
    public $children = array();

    private $position;

    private $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function valid()
    {
        return isset($this->children[$this->position]);
    }

    public function next()
    {
        $this->position++;
    }

    public function current()
    {
        return $this->children[$this->position];
    }

    public function rewind()
    {
        $this->position = 0;
    }

    public function key()
    {
        return $this->position;
    }

    public function hasChildren()
    {
        return !empty($this->children[$this->position]);
    }

    public function getChildren()
    {
        return $this->children[$this->position];
    }

    public function __toString()
    {
        return $this->name;
    }
}

这是测试:

use RecursiveIteratorIterator as RII;

$o1 = new Obj('Root');

$i1 = new Obj('Item 1');
$i12 = new Obj('Subitem 2');
$i1->children[] = new Obj('Subitem 1');
$i1->children[] = $i12;

$i12->children[] = new Obj('Subsubitem 1');
$i12->children[] = new Obj('Enough....');

$o1->children[] = $i1;
$o1->children[] = new Obj('Item 2');
$o1->children[] = new Obj('Item 3');

foreach (new RII($o1, RII::LEAVES_ONLY) as $o) {
    echo "<br>" . $o;
}
4

1 回答 1

2

您假设指向正确的方向,hasChildren()您的方法存在问题。将其与valid()and 与current()方法进行比较,您可能已经看到它将始终返回 true。

因为只要有current(),就hasChildren()返回 true:

public function current()
{
    return $this->children[$this->position];
}

和:

public function hasChildren()
{
    return !empty($this->children[$this->position]);
}

相反,您想测试当前元素是否有子元素:

public function hasChildren()
{
    return !empty($this->current()->children);
}

将为您提供输出的细微差别:

Subitem 1
Subsubitem 1
Enough....
Item 2
Item 3

通过总是返回TRUEfor hasChildren()RecursiveIteratorIterator无法检测到任何叶子。通过树的概念,这是不可能的,但在遍历过程中-正如您用“错误”所证明的那样-显然是可能的:)

也可以看看(如果可以的话):

于 2013-07-23T09:24:48.837 回答