php - 为什么当我遍历这个数组两次时 PHP 会覆盖值(通过引用,通过值)

标签 php php-5.3

如果我遍历一个数组两次,一次通过引用,然后通过值,如果我在每个循环中使用相同的变量名,PHP 将覆盖数组中的最后一个值。这最好通过一个例子来说明:

$array = range(1,5);
foreach($array as &$element)
{
  $element *= 2;
}
print_r($array);
foreach($array as $element) { }
print_r($array);

输出:

Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 10 )

Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 8 )

请注意,我不是在寻找修复方法,我是想了解为什么会发生这种情况。另请注意,如果每个循环中的变量名称都不是每个都称为 $element,则不会发生这种情况,所以我猜这与 $element 仍然存在有关第一个循环结束后的作用域和引用。

最佳答案

在第一个循环之后 $element 仍然是对 $array 的最后一个元素/值的引用。
您可以看到,当您使用 var_dump() 而不是 print_r() 时

array(5) {
  [0]=>
  int(2)
...
  [4]=>
  &int(2)
}

请注意 &int(2) 中的 &。
在第二个循环中,您将值分配给 $element。因为它仍然是一个引用,所以数组中的值也发生了变化。尝试一下

foreach($array as $element)
{
  var_dump($array);
}

作为第二个循环,你会看到。
所以它或多或少与

$array = range(1,5);
$element = &$array[4];
$element = $array[3];
// and $element = $array[4];
echo $array[4];

(只有循环和乘法……嘿,我说的是“或多或少”;-))

关于php - 为什么当我遍历这个数组两次时 PHP 会覆盖值(通过引用,通过值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3673417/

相关文章:

mysql - 如何维护段落?

php - 使用代码覆盖率运行 PHPUnit 时出现 "Cannot redeclare class"错误

PHP 似乎得到了错误的查询结果

php - urlManager 在 Yii 2.0 中不起作用

php - 基于 Web 的 SQLite 文件的推荐文件权限

mysql - cms php 旋律 url 重建所需的重写规则

php - crypt() 函数中的最大字符串输入是多少?

php - 从 php 在计算机上运行脚本

php - Python:CGI程序想知道调用网页的IP地址

php - 使用 php 5.3 在插入之前检查 MySQL 行中的数据