首页  >  文章  >  后端开发  >  为什么在使用带有引用传递的 foreach 循环时,PHP 数组中的最后一个元素会重复?

为什么在使用带有引用传递的 foreach 循环时,PHP 数组中的最后一个元素会重复?

Susan Sarandon
Susan Sarandon原创
2024-11-14 20:19:01367浏览

Why does the last element in a PHP array duplicate when using a foreach loop with pass-by-reference?

PHP Foreach 通过引用传递:最后一个元素重复之谜揭开

考虑以下 PHP 代码:

$arr = ["foo", "bar", "baz"];

foreach ($arr as &$item) { /* do nothing by reference */ }
print_r($arr);

foreach ($arr as $item) { /* do nothing by value */ }
print_r($arr);

执行时,它意外地修改了原始数组$arr,导致以下结果输出:

Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)
Array
(
    [0] => foo
    [1] => bar
    [2] => bar
)

理解行为

在初始 foreach 循环之后,变量 $item 仍然是对与 $arr[2] 相同的内存位置的引用。因此,第二个 foreach 循环的每次迭代(按值传递参数)都会用新迭代的值替换引用的值(因此 $arr[2])。

详细说明

在第一个循环中:

  • $item 引用了以下位置的值$arr[0],即“foo”。
  • $item 和 $arr[0] 都指向“foo”。
  • 对于 $arr[1] 和 $ 重复此过程arr[2].

第一个循环结束时,$item 仍然指向$arr[2].

在第二个循环中:

  • $item 被赋予 $arr[0] 的值,即 'foo'。
  • $arr[2] (仍被 $item 引用)也设置为 'foo'。
  • 这会覆盖原来的$arr[2] 处 'baz' 的值。
  • $arr[1] 也会发生同样的过程,最后 $arr[2] 被赋值为 $arr[2] 的值,即由于之前的迭代,现在为“bar”。

澄清误解

此行为不被视为错误。它与 PHP 中引用的预期行为一致。如果您在循环之外使用以下语法,将会观察到类似的结果:

for ($i = 0; $i < count($arr); $i++) { $item = $arr[$i]; }

结论

在 PHP 中使用引用时,认识到这一点至关重要通过引用变量所做的修改也会影响原始值。根据期望的结果,可以有效地利用或避免这种行为。

以上是为什么在使用带有引用传递的 foreach 循环时,PHP 数组中的最后一个元素会重复?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn