<?php
function generator1(): Traversable
{
yield 'alpha';
yield 'beta';
yield 'delta';
}
function generator2(): Traversable
{
yield from generator1();
yield 'upsilon';
yield 'omega';
}
function resolve(iterable $generator) {
foreach ($generator as $index => $item)
echo "$index $item" . PHP_EOL;
}
resolve(generator1());
echo PHP_EOL;
resolve(generator2());
die;
产生如下结果:
0 alpha
1 beta
2 delta
0 alpha
1 beta
2 delta
0 upsilon
1 omega
最后一个流应该是:
0 alpha
1 beta
2 delta
3 upsilon
4 omega
这是怎么回事?这是PHP中的一个错误(我在Ubuntu中运行v7.4.10)。我如何得到正确的结果,而不使用数组或其他形式的收集器?
结果是iterator_to_array()函数的特性。第二个参数必须设置为false,以便所有值都记录在注释中。
在PHP手册中也特别指出了这一点。
function generator1(): Traversable
{
yield 'alpha';
yield 'beta';
yield 'delta';
yield 'gamma';
yield 'epsilon';
yield 'eta';
}
function generator2(): Traversable
{
yield from generator1();
yield 'upsilon';
yield 'omega';
}
var_dump(iterator_to_array(generator2()));
var_dump(iterator_to_array(generator2(), false));
结果:
array(6) {
[0]=>
string(7) "upsilon"
[1]=>
string(5) "omega"
[2]=>
string(5) "delta"
[3]=>
string(5) "gamma"
[4]=>
string(7) "epsilon"
[5]=>
string(3) "eta"
}
array(8) {
[0]=>
string(5) "alpha"
[1]=>
string(4) "beta"
[2]=>
string(5) "delta"
[3]=>
string(5) "gamma"
[4]=>
string(7) "epsilon"
[5]=>
string(3) "eta"
[6]=>
string(7) "upsilon"
[7]=>
string(5) "omega"
}
在沙箱里自己试一试。
当使用foreach输出键和值时,这一点变得清晰。
foreach(generator2() as $key => $value){
var_dump($key,$value);
}
输出:
int(0) string(5) "alpha"
int(1) string(4) "beta"
int(2) string(5) "delta"
int(3) string(5) "gamma"
int(4) string(7) "epsilon"
int(5) string(3) "eta"
int(0) string(7) "upsilon"
int(1) string(5) "omega"