首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"yield“和"yield”在同一函数中

"yield“和"yield”在同一函数中
EN

Stack Overflow用户
提问于 2020-12-05 02:43:22
回答 1查看 17关注 0票数 0

我需要在同一个函数中使用yieldyield from,但它似乎不能像预期的那样工作,一旦它只产生最后一个yield fromyield (最后出现的)。

我的代码是(https://3v4l.org/jFDXh):

代码语言:javascript
复制
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转换为一个数组。

那么,我错过了什么?

EN

回答 1

Stack Overflow用户

发布于 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):

代码语言:javascript
复制
function willOutputSingle() {
    yield 'sameKey' => 'originalValue';
    yield 'sameKey' => 'otherValue';
}

var_dump(
    iterator_to_array(
        willOutputSingle()
    )    
); 

// Outputs: [ 'sameKey' => 'otherValue' ]

这会发生,因为我们先是[ 'sameKey' => 'originalValue' ],然后是[ 'sameKey' => 'otherValue' ],所以当我们通过iterator_to_array()将其转换为数组时,结果基本上是这样的:

代码语言:javascript
复制
[ 'sameKey' => 'originalValue',
  'sameKey' => 'otherValue ]

但是PHP不允许相同的键,只保留最后一个键。

的解决方案是将false作为第二个参数传递给iterator_to_array(),因为它不会保留生成的键,所以结果将是一个零索引数组。结果将是:

代码语言:javascript
复制
[ 0 => 'originalValue',
  1 => 'otherValue' ]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65149023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档