我在生成器中遇到了这种奇怪的行为,这在PHP手册中没有描述过。
我有两个foreach循环-第一个设置一些默认值,第二个覆盖它们。但是由于缺少了一些键:值对,所以我不能使用array_merge(),所以我尝试使用生成器来实现这个目的。
我发现在关联数组中覆盖了产生键,即使是医生说。
生成键/值对的语法非常类似于用于定义关联数组的语法,如下所示。
示例:
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"这行为正确吗?
发布于 2015-10-23 15:12:37
生成器不是关联数组。它说“生成键/值对的语法非常类似于.关联数组”;它根本没有说生成器的行为像关联数组。
事实上,它不能表现出相同的和重复的键,因为键不是一次就知道的。每个键都是在需要时生成的,而不是在之前生成的。在生成器上循环的foreach语法实际上是这方面的语法糖:
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;这将多次产生相同的密钥,这是不可预测的。很明显,它的行为根本不像一个数组。它只产生一对值,但这些值根本不是数组的一部分,因此也不是重复的。此外,生成器只在被请求时生成下一个值,否则将导致无限循环。
https://stackoverflow.com/questions/33303986
复制相似问题