首页 >后端开发 >php教程 >为什么使用引用传递的 PHP foreach 循环会意外更改我的数组?

为什么使用引用传递的 PHP foreach 循环会意外更改我的数组?

Barbara Streisand
Barbara Streisand原创
2024-11-13 10:54:02568浏览

Why does my PHP foreach loop with pass-by-reference change my array unexpectedly?

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中文网其他相关文章!

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