PHP Foreach 按引用传递和数组修改
在 PHP 中,在 foreach 循环中使用按引用传递可能会导致意外行为。考虑以下代码:
$arr = ["foo", "bar", "baz"]; foreach ($arr as &$item) {} // Array remains unchanged: ["foo", "bar", "baz"] foreach ($arr as $item) {} // Array is modified: ["foo", "bar", "bar"]
为什么第二个循环修改数组?
在第一个循环中,$item 变量是通过引用传递的。这意味着对 $item 所做的更改也会影响 $arr 数组中的相应元素。但是,在第二个循环中,$item 是按值传递的。因此,对 $item 所做的更改不会影响数组。
至关重要的是,在第一个循环之后,$item 仍然引用 $arr 的最后一个元素。当第二个循环遍历数组时,$item 的每个值都会覆盖 $arr 的最后一个元素,因为它们都引用相同的内存位置。
调试输出
要理解其行为,我们可以回显 $item 的当前值,并在每次循环迭代期间递归打印 $arr 数组。
第一个循环:
foo Array ( [0] => foo [1] => bar [2] => baz ) bar Array ( [0] => foo [1] => bar [2] => baz ) baz Array ( [0] => foo [1] => bar [2] => baz )
第一次循环后,$item指向$arr的最后一个元素。
第二次循环:
foo Array ( [0] => foo [1] => bar [2] => foo ) bar Array ( [0] => foo [1] => bar [2] => bar ) bar Array ( [0] => foo [1] => bar [2] => bar )
$item的每个值都被覆盖,它还会修改 $arr 的最后一个元素。
这是一个 Bug 吗?
不,这种行为不是一个 Bug,而是 pass- 的预期行为通过引用。了解通过引用传递变量的含义并正确使用它非常重要。
以上是为什么在 PHP `foreach` 循环中使用引用传递会在循环结束后修改数组?的详细内容。更多信息请关注PHP中文网其他相关文章!