<?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中的bug吗(我在Ubuntu中运行的是v7.4.10 )。如何在不使用数组或其他形式的收集器的情况下获得正确的结果?
发布于 2021-09-20 06:09:42
结果是iterator_to_array()函数的一个特性。第二个参数必须设置为false,以便所有值都记录在注释中。
在PHP manual中也特别指出了这一点。
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"
}Try for yourself in the sandbox.
当使用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"https://stackoverflow.com/questions/69247807
复制相似问题