我需要写一个简单的脚本,从多个文件中加载数据,并以某种方式合并它们。然而,考虑到文件可能相当大,我想部分加载数据。为此,我决定使用yield。根据示例,我发现我可以使用以下结构来生成单个生成器:
$generator = $someClass->load(); //load method uses yield so it returns generator object
foreach($generator as $i) {
// do something
}
但是如果我想同时使用两个发电机呢?
$generatorA = $someClass1->load(); //load method uses yield so it returns generator object
$generatorB = $someClass2->load(); //load method uses yield so it returns generator object
foreach($generatorA as $i) {
// how can I access to resultSet from generatorB here?
}
7条答案
按热度按时间gv8xihay1#
Generators in PHP实现了
Iterator
interface,因此您可以合并/合并多个Generator
,就像您可以组合多个Iterator
一样。如果你想一个接一个地迭代两个生成器(合并A + B),那么你可以使用
AppendIterator
。如果你想一次迭代两个生成器,你可以使用
MultipleIterator
。这两个例子,包括例子和警告,都在我的这个博客帖子中:
否则我不明白你一直在问什么。如果你能澄清,我应该可以给予你更多的方向。
6ss1mwsb2#
来自https://www.php.net/manual/en/language.generators.syntax.php#control-structures.yield.from
通过
yield from
进行的生成器委派在PHP 7中,生成器委托允许您使用**
yield from
**关键字从另一个生成器、Traversable
对象或array
中生成值。然后外部生成器将从内部生成器、对象或数组中生成所有值,直到这些值不再有效,然后在外部生成器中继续执行。因此,可以使用
yield from
合并两个(或更多)生成器。或者更花哨一些(这里不可能使用
yield from
):z2acfund3#
虽然
AppendIterator
适用于Iterators
,但它存在一些问题。首先,需要构造一个新的对象而不是调用一个函数是不太好的,更不好的是,你需要改变
AppendIterator
,因为你不能在它的构造函数中提供内部迭代器。其次,
AppendIterator
只接受Iterator
示例,所以如果你有一个Traversable
,比如IteratorAggregate
,你就不走运了。这个PHP 7.1+函数结合了两个
iterable
:用法示例:
此函数是small library for working with iterable的一部分,在small library for working with iterable中也进行了广泛的测试。
xxb16uws4#
如果要将Generators与AppendIterator一起使用,则需要将NoRewindIterator与它一起使用:
https://3v4l.org/pgiXB
如果Generator从未实际调用
yield
,则尝试使用AppendIterator遍历空Generator将导致致命错误:https://3v4l.org/B4Qnh
输出量:
xienkqul5#
您可以使用来自
可重用函数示例
stszievb6#
类似于:
sh7euo9m7#
试试这个: