我需要在同一个函数中使用yield和yield from,但它似乎不能像预期的那样工作,一旦它只产生最后一个yield from或yield (最后出现的)。
我的代码是(https://3v4l.org/jFDXh):
function yieldItems() {
yield 1;
yield 2;
yield 3;
yield from [4, 5, 6];
yield from [7, 8, 9];
}
var_dump(
iterator_to_array(
yieldItems()
)
);对于所有的PHP版本,它将只输出[ 7, 8, 9 ],但我似乎很清楚,它应该是[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]。
但是,如果我通过foreach执行同样的操作,一切似乎都很正常。它看起来像是一个与iterator_to_array()相关的问题,但实际上,我需要将这个Generator转换为一个数组。
那么,我错过了什么?
发布于 2020-12-05 02:43:22
当我总结的时候,我意识到这个问题实际上与iterator_to_array()有关,所以我决定在中更深入地搜索,它正好显示了这种类型的问题。
按照文档进行操作:
来自的
keys不重置密钥。它保留由可遍历对象或数组返回的键。因此,一些值可能与另一个 that 或that共享一个公共密钥,在插入到数组中时,将用该密钥覆盖以前的值。
这很重要的一个常见情况是iterator_to_array() 返回一个键控数组,默认情况下为,这可能会导致意外的结果。iterator_to_array() 有第二个参数 use_keys ,该参数可以设置为 FALSE以收集所有值,同时忽略生成器返回的键。
一般来说,这意味着当从中使用yield/yield时,它也将输出键(例如,第一个 means 将是0 ),就像它实际存在于纯数组一样。因此,下面的代码将类似地失败(https://3v4l.org/pWeWT):
function willOutputSingle() {
yield 'sameKey' => 'originalValue';
yield 'sameKey' => 'otherValue';
}
var_dump(
iterator_to_array(
willOutputSingle()
)
);
// Outputs: [ 'sameKey' => 'otherValue' ]这会发生,因为我们先是[ 'sameKey' => 'originalValue' ],然后是[ 'sameKey' => 'otherValue' ],所以当我们通过iterator_to_array()将其转换为数组时,结果基本上是这样的:
[ 'sameKey' => 'originalValue',
'sameKey' => 'otherValue ]但是PHP不允许相同的键,只保留最后一个键。
的解决方案是将false作为第二个参数传递给iterator_to_array(),因为它不会保留生成的键,所以结果将是一个零索引数组。结果将是:
[ 0 => 'originalValue',
1 => 'otherValue' ]https://stackoverflow.com/questions/65149023
复制相似问题