RecursiveArrayIterator当前数组

时间:2010-06-30 11:24:50

标签: php arrays

我正在尝试获取整个当前数组,并且我认为我没有采用正确的方法,因为我有时会收到未定义的索引错误。

    $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($comments_array), RecursiveIteratorIterator::SELF_FIRST);
    while ($iterator->valid()) {
        if ($iterator->hasChildren()) {
            $row = $iterator->getChildren();
            $depth = $iterator->getDepth();
            echo $row['User_ID'] . "<br>";
        }
        $iterator->next();
    }

我知道你可以做foreach ($iterator->getChildren() as $key => $value)但这对我没有帮助,因为我想要整个阵列。

希望这有意义吗?!

1 个答案:

答案 0 :(得分:3)

我经常使用过滤迭代器来处理这种任务,而不是使用一些疯狂的嵌套if块。通常情况下,像这样的任务可以被抽象为更通用的东西 - 不仅仅是这个数组/循环的用途 - 这就是我在这里采用的方法。

因此,下面的答案不是最简单最快最小更改代码才能完成工作。但是,对于您自己或其他想要使用任何类型的递归迭代器执行类似操作的人来说,它可能在其他地方有用。


所以,任务归结为如何在没有父母父母的情况下只获得迭代器(或数组)的父级?一种方法是使用如下的过滤迭代器:

class FirstParentIterator extends FilterIterator {
    public function __construct(RecursiveIterator $iterator) {
        parent::__construct(
            new RecursiveIteratorIterator(
                new ParentIterator($iterator),
                RecursiveIteratorIterator::SELF_FIRST
            )
        );
    }
    public function accept() {
        // Only accept immediate parents of leaf elements
        return $this->hasChildren() && ! $this->getChildren()->hasChildren();
    }
}

将这样的过滤器用于某些用途会使您的原始循环更加整洁:

$iterator = new FirstParentIterator(new RecursiveArrayIterator($comments_array));
foreach ($iterator as $row) {
    echo $row['User_ID'] . "<br>";
}