我不得不花几个小时来弄清楚为什么 a[3] 在每次迭代中都会发生变化。这就是我得到的解释。
PHP 中有两种类型的变量:普通变量和引用变量。如果我们将一个变量的引用分配给另一个变量,该变量就成为引用变量。
例如在
$a = array('zero', 'one', 'two', 'three');
如果我们这样做
$v = &$a[0]
第 0 个元素($a[0]
) 成为参考变量。$v
指向该变量;因此,如果我们做出任何改变$v
,它将反映在$a[0]
反之亦然。
现在如果我们这样做
$v = &$a[1]
$a[1]
将成为参考变量并且$a[0]
将成为一个普通变量(因为没有其他人指向$a[0]
它被转换为普通变量。 PHP 足够聪明,可以在没有其他人指向它时将其设为普通变量)
这是第一个循环中发生的情况
foreach ($a as &$v) {
}
最后一次迭代之后$a[3]
是一个参考变量。
Since $v
正在指向$a[3]
任何改变$v
结果改变为$a[3]
在第二个循环中,
foreach ($a as $v) {
echo $v.'-'.$a[3].PHP_EOL;
}
在每次迭代中作为$v
变化,$a[3]
变化。 (因为$v
仍然指向$a[3]
)。这就是为什么$a[3]
每次迭代都会发生变化。
在最后一次迭代之前的迭代中,$v
被分配值“二”。自从$v
指着$a[3]
, $a[3]
现在得到值“二”。请记住这一点。
在最后一次迭代中,$v
(这指向$a[3]
) 现在的值为“二”,因为$a[3]
在上一次迭代中设置为 2。two
被打印。这解释了为什么在最后一次迭代中打印 $v 时会重复“two”。