gpt4 book ai didi

php - "yield"覆盖 "yield from"项

转载 作者:行者123 更新时间:2023-12-04 12:27:49 24 4
gpt4 key购买 nike

<?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 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"

关于php - "yield"覆盖 "yield from"项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69247807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com