RecursiveIterator有什么意义?

时间:2013-12-20 14:34:06

标签: php iterator

我即将在PHP 5.4中实现pythons itertools.groupby;因为我需要它。

它是一个迭代器,它将迭代器作为输入并返回一系列迭代器,这正是它对这个问题不重要的。

似乎这样应该是一个RecursiveIterator;但我无法确定该界面的用途是什么。

为什么你不直接返回迭代器而不是绕过hasChildren?而另一件事;那么价值应该是什么?

我可能是错的; GroupBy 应该是RecursiveIterator;但这就是问题所在。什么 RecursiveIterator的目的/用例?

编辑:这个问题我们重复“RecursiveIteratorIterator如何在PHP中工作?”关于数组的问题不仅仅是关于ArrayIterator的深入讨论。

这个问题是关于RecursiveIterator,为什么你使用它,什么时候适合使用等等。我对使用该接口的一些具体类不感兴趣。

1 个答案:

答案 0 :(得分:2)

迭代器遍历集合。说,鉴于这种结构:

array(
    'foo',
    'bar',
    array(
        'baz'
    )
)

常规Iterator会迭代此结构并返回foobarArrayRecursiveIterator有方法发出信号嘿,如果你想要我RecursiveIterator::hasChildrenRecursiveIterator::getChildren,我可以迭代一个孩子。您可以编写代码来检测这些子代的存在并自己获取子迭代器,或者您可以使用RecursiveIteratorIterator,它为您执行此操作,并允许您迭代结构,就像它是一个平面列表一样,返回foobarbaz

foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as ...)

区别存在,您可以:

  • 迭代一个单位列表,或
  • 使用“手动递归”或
  • 迭代一个平面列表
  • 迭代一个递归结构,好像它是一个平面列表

我会说RecursiveIterator接口很少被“使用者”直接使用,但它是RecursiveIteratorIterator的构建块,它允许您轻松地为自己的递归数据结构定义自己的迭代器由RecursiveIteratorIterator迭代。它允许您通过定义两个方法来廉价地实现递归:一个检查元素是否可迭代,另一个返回迭代器。