首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么“产生”不覆盖PHP中的键值对?

问为什么“产生”不覆盖PHP中的键值对?
EN

Stack Overflow用户
提问于 2015-10-23 13:49:26
回答 1查看 2.7K关注 0票数 2

我在生成器中遇到了这种奇怪的行为,这在PHP手册中没有描述过。

我有两个foreach循环-第一个设置一些默认值,第二个覆盖它们。但是由于缺少了一些键:值对,所以我不能使用array_merge(),所以我尝试使用生成器来实现这个目的。

我发现在关联数组中覆盖了产生键,即使是医生说。

生成键/值对的语法非常类似于用于定义关联数组的语法,如下所示。

示例:

代码语言:javascript
复制
function yieldTest()
{
    // those are array values (in my code - taken from data source; here static example)
    $arr1 = ['a' => 1, 'b' => 2, 'c' => 3];
    $arr2 = ['b' => 'B', 'd' => 'D'];

    // 1st loop
    foreach ($arr1 as $k => $v) {
        yield $k => $v;
    }

    // 2nd loop
    foreach ($arr2 as $k => $v) {
        yield $k=>$v;
    }
}

foreach(yieldTest() as $k=>$v) {
    var_dump($k . ' = ' . $v) . "\n";
}

这一结果与

代码语言:javascript
复制
string(5) "a = 1"
string(5) "b = 2"
string(5) "c = 3"
string(5) "b = B"
string(5) "d = D"

所以钥匙没被耍过。我希望得到以下输出:

代码语言:javascript
复制
string(5) "a = 1"
string(5) "b = B"
string(5) "c = 3"
string(5) "d = D"

这行为正确吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-23 15:12:37

生成器不是关联数组。它说“生成键/值对的语法非常类似于.关联数组”;它根本没有说生成器的行为像关联数组。

事实上,它不能表现出相同的和重复的键,因为键不是一次就知道的。每个键都是在需要时生成的,而不是在之前生成的。在生成器上循环的foreach语法实际上是这方面的语法糖:

代码语言:javascript
复制
function foo() {
    while (true) {
        yield mt_rand(1, 2) => 'foo';
    }
}

$foo = foo();
$foo->next();
echo $foo->key(), ' => ', $foo->current(), PHP_EOL;
$foo->next();
echo $foo->key(), ' => ', $foo->current(), PHP_EOL;
$foo->next();
echo $foo->key(), ' => ', $foo->current(), PHP_EOL;
$foo->next();
echo $foo->key(), ' => ', $foo->current(), PHP_EOL;

这将多次产生相同的密钥,这是不可预测的。很明显,它的行为根本不像一个数组。它只产生一对值,但这些值根本不是数组的一部分,因此也不是重复的。此外,生成器只在被请求时生成下一个值,否则将导致无限循环。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33303986

复制
相关文章

相似问题

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