PHP Foreach 通过引用传递:最后一个元素重复? (错误?)
理解问题
考虑以下 PHP 代码:
$arr = array("foo", "bar", "baz"); foreach ($arr as &$item) {} print_r($arr); foreach ($arr as $item) {} print_r($arr); // $arr has changed to ["foo", "bar", "bar"]
第一个循环之后,数组按预期打印:
Array ( [0] => foo [1] => bar [2] => baz )
但是,在第二次循环之后,数组意外更改:
Array ( [0] => foo [1] => bar [2] => bar )
说明
问题出现此问题是因为第一个 foreach 循环通过引用传递 $item。这意味着 $item 是 $arr 数组中元素的别名。在第一个循环中,未对 $item 或 $arr 进行任何更改。
但是,第二个循环按值传递 $item。当循环中给 $item 的值赋予新值时,$arr 中对应的元素也会被修改。
具体来说,$arr 的第三个元素(“baz”)被替换为第二个循环的最后一次迭代期间的第二个元素(“bar”)。这解释了为什么 $arr 的最后一个元素在第二次循环后重复。
这是一个错误吗?
不,这种行为不是一个错误。这是 foreach 循环在通过引用传递变量时的预期行为。请务必注意此行为,以避免数组发生意外更改。
调试输出
为了帮助可视化该行为,以下代码添加了 echo 语句在每次循环迭代后打印 $item 和数组 $arr 的值:
echo "<br>"; foreach ($arr as &$item) { echo "Item: $item; Arr: "; print_r($arr); echo "<br>"; } echo "<br>"; foreach ($arr as $item) { echo "Item: $item; Arr: "; print_r($arr); echo "<br>"; }
输出演示了 $item 和 $arr 在循环期间如何变化,清楚地说明了上述行为。
以上是为什么使用引用传递的 PHP foreach 循环会意外更改我的数组?的详细内容。更多信息请关注PHP中文网其他相关文章!