我即将在PHP 5.4中实现pythons itertools.groupby;因为我需要它。
它是一个迭代器,它将迭代器作为输入并返回一系列迭代器,这正是它对这个问题不重要的。
似乎这样应该是一个RecursiveIterator;但我无法确定该界面的用途是什么。
为什么你不直接返回迭代器而不是绕过hasChildren?而另一件事;那么价值应该是什么?
我可能是错的; GroupBy 不应该是RecursiveIterator;但这就是问题所在。什么是 RecursiveIterator的目的/用例?
编辑:这个问题我们不重复“RecursiveIteratorIterator如何在PHP中工作?”关于数组的问题不仅仅是关于ArrayIterator的深入讨论。
这个问题是关于RecursiveIterator,为什么你使用它,什么时候适合使用等等。我对使用该接口的一些具体类不感兴趣。
答案 0 :(得分:2)
迭代器遍历集合。说,鉴于这种结构:
array(
'foo',
'bar',
array(
'baz'
)
)
常规Iterator
会迭代此结构并返回foo
,bar
和Array
。 RecursiveIterator
有方法发出信号嘿,如果你想要我(RecursiveIterator::hasChildren
和RecursiveIterator::getChildren
,我可以迭代一个孩子。您可以编写代码来检测这些子代的存在并自己获取子迭代器,或者您可以使用RecursiveIteratorIterator
,它为您执行此操作,并允许您迭代结构,就像它是一个平面列表一样,返回foo
,bar
,baz
。
foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as ...)
区别存在,您可以:
我会说RecursiveIterator
接口很少被“使用者”直接使用,但它是RecursiveIteratorIterator
的构建块,它允许您轻松地为自己的递归数据结构定义自己的迭代器由RecursiveIteratorIterator
迭代。它允许您通过定义两个方法来廉价地实现递归:一个检查元素是否可迭代,另一个返回迭代器。