【问题标题】:What is the point of RecursiveIterator? [duplicate]RecursiveIterator 的意义何在? [复制]
【发布时间】:2014-01-09 10:50:20
【问题描述】:

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

它是一个迭代器,它接受一个迭代器作为输入并返回一个迭代器序列,它究竟做了什么对这个问题并不重要。

似乎应该是一个 RecursiveIterator;但我不知道那个界面的目的是什么。

你为什么不直接return 迭代器而不是绕道 hasChildren 呢?还有一件事;那么值应该是多少呢?

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

编辑:这个问题我们不是重复“RecursiveIteratorIterator 如何在 PHP 中工作?”深入讨论 ArrayIterator 可以完全回答有关数组的任何问题。

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

【问题讨论】:

  • RecursiveIterator 的重点是遍历递归结构。
  • @Jack 如果我想了解 RecursiveIteratorIterator,我会问 RecursiveIteratorIterator,而不是 RecursiveIterator。
  • 对,迭代器太多了。

标签: php iterator


【解决方案1】:

一个迭代器迭代一个集合。说,给定这个结构:

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

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

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

存在区别,因此您可以:

  • 遍历平面列表,或
  • 使用“手动递归”遍历平面列表,或
  • 迭代递归结构,就像它是一个平面列表一样

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

【讨论】:

  • 所以 RecursiveIterator 遍历树,其中每个节点都有一个值和可能的子节点。密切相关:OuterIterator 有both 值和子项。这就引出了一个问题; RecusiveIterator 和假设的 TreeIterator 之间是否有明显的区别?还是只是选择一个名字而不是另一个名字?
  • 不完全是。 RecursiveIterator 使用获取子迭代器的选项对列表进行迭代。 RecursiveIterarorIterator 迭代递归结构,RecursiveIterator 提供访问权限。 “TreeIterator”可能会将这两个任务合并到一个类中,而不是将其分解为两个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 2017-07-15
  • 2013-02-11
  • 2012-07-10
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多