PHP - 迭代两次通用迭代

Posted

技术标签:

【中文标题】PHP - 迭代两次通用迭代【英文标题】:PHP - Iterating twice a generic iterable 【发布时间】:2017-09-21 11:08:45 【问题描述】:

php 7.1 中有一个新的 iterable psudo-type 抽象数组和 Traversable 对象。

假设在我的代码中我有一个如下所示的类:

class Foo

    private $iterable;

    public function __construct(iterable $iterable)
    
        $this->iterable = $iterable;
    

    public function firstMethod()
    
        foreach ($this->iterable as $item) ...
    

    public function secondMethod()
    
        foreach ($this->iterable as $item) ...
    

如果$iterable 是一个数组或Iterator,这很好用,除非$iterableGenerator。实际上,在这种情况下,调用firstMethod() 然后调用secondMethod() 会产生以下Exception: Cannot traverse an already closed generator

有没有办法避免这个问题?

【问题讨论】:

【参考方案1】:

发电机不能倒带。如果你想避免这个问题,你必须制作一个新的生成器。如果您创建一个实现 IteratorAggregate 的对象,这可以自动完成:

class Iter implements IteratorAggregate

    public function getIterator()
    
        foreach ([1, 2, 3, 4, 5] as $i) 
            yield $i;
        
    

然后只需将此对象的一个​​实例作为您的迭代器传递:

$iter = new Iter();
$foo = new Foo($iter);
$foo->firstMethod();
$foo->secondMethod();

输出:

1
2
3
4
5
1
2
3
4
5

【讨论】:

以上是关于PHP - 迭代两次通用迭代的主要内容,如果未能解决你的问题,请参考以下文章

在窗体中迭代所有控件及其相关控件的通用递归方法

Python:迭代具有不同维度的列表,是不是有通用方法?

迭代时如何从通用列表中删除元素?

数据结构与算法深入浅出递归和迭代的通用转换思想

通用的“越界”、“结束”迭代器

错误 1066:无法在 Pig 中打开别名的迭代器,通用解决方案