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

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

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

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