2013-12-20 64 views
0

我即将在PHP 5.4中实现pythons itertools.groupby;因为我需要它。RecursiveIterator有什么意义?

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

好像像这样应该是一个RecursiveIterator;但我不知道该接口的用途是什么。

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

这可能是我错了; GroupBy应该是而不是是RecursiveIterator;但这是个问题。什么 RecursiveIterator的用途/用例?

编辑:这个问题我们不是重复的“RecursiveIteratorIterator如何在PHP中工作?”除了关于数组的问题之外,关于ArrayIterator的深入讨论将完全回答。

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

+0

RecursiveIterator的要点是迭代递归结构。 –

+0

@Odalrick请参阅http:// stackoverflow。com/a/12235779/113938 – salathe

+0

@Jack如果我想了解RecursiveIteratorIterator,那么我会询问RecursiveIteratorIterator,而不是RecursiveIterator。 – Odalrick

回答

2

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

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

定期Iterator会遍历这个结构并返回foobarArray。 A RecursiveIterator有方法来发信号嘿,如果你想让我RecursiveIterator::hasChildrenRecursiveIterator::getChildren)有一个孩子可以迭代。您可以编写代码来检测这些子代的存在并自己获取子迭代器,或者您可以使用RecursiveIteratorIterator,它可以为您执行此操作,并让您像遍历列表一样遍历结构,返回foobarbaz

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

的区别存在,所以你可以:

  • 迭代一个平面列表,或
  • 重复的进行“手动递归”平面列表,或
  • 遍历一个递归结构好像它是一个平板清单

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

+0

因此,RecursiveIterator遍历一棵树,其中每个节点都有一个值并可能有子节点。密切相关:OuterIterator具有值和子元素。这引出了问题; RecusiveIterator和假设的TreeIterator之间有明显的区别;或者仅仅是选择另一个名称的情况? – Odalrick

+0

不完全。一个'RecursiveIterator'遍历一个列表,可以选择获取子迭代器。 'RecursiveIterarorIterator'循环遍历RecursiveIterator提供的访问权限。一个“TreeIterator”可能会将这两个任务合并到一个类中,而不是将其分解为两个。 – deceze