【发布时间】:2016-01-23 02:05:36
【问题描述】:
我在使用生成器时遇到了这种奇怪的行为,PHP 手册中没有描述。
我有两个 foreach 循环 - 第一个设置一些默认值,第二个覆盖它们。但是由于缺少一些键:值对,我无法使用 array_merge(),因此我尝试使用生成器来实现此目的。
我发现即使docs say:
关联数组中的 yield 键也会被覆盖产生键/值对的语法与用于定义关联数组的语法非常相似,如下所示。
例子:
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";
}
结果是
string(5) "a = 1"
string(5) "b = 2"
string(5) "c = 3"
string(5) "b = B"
string(5) "d = D"
所以密钥并没有被过度篡改。我期待得到以下输出:
string(5) "a = 1"
string(5) "b = B"
string(5) "c = 3"
string(5) "d = D"
这是正确的行为吗?
【问题讨论】:
-
您看到了我希望看到的行为。我不明白您认为使用
array_merge有什么问题? -
print_r(yieldTest()) 的输出是什么; ?
-
哪一点是奇怪的行为?生成器产生你告诉它产生的东西,无论你之前是否产生过相同的键,键是布尔值、整数还是对象(如果你真的想的话,你甚至可以产生一个资源作为键)