首页 > 后端开发 > php教程 > 为什么 PHP 的 Foreach 循环中的最后一个元素会通过引用传递而重复?

为什么 PHP 的 Foreach 循环中的最后一个元素会通过引用传递而重复?

Linda Hamilton
发布: 2024-11-16 19:08:02
原创
847 人浏览过

Why Does the Last Element Duplicate in PHP's Foreach Loop with Pass-by-Reference?

PHP Foreach 通过引用传递谜题:神秘的最后一个元素重复

在 PHP 中,当您使用带有 pass-by 的 foreach 循环时,引用分配(例如,foreach ($arr as &$item)),可能会出现意外行为。考虑这个令人困惑的示例:

$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 has inexplicably changed
登录后复制

此代码输出:

Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)
Array
(
    [0] => foo
    [1] => bar
    [2] => bar
)
登录后复制

解释重复

第一个 foreach 循环之后,每个元素$arr 仍然被 $item 引用。当第二个循环迭代时,它用 $item 的值替换每个元素的值,$item 恰好是数组的最后一个元素。这意味着 $arr 的每个元素都设置为 $arr[2] 的值,导致输出中最后一个元素重复。

调试输出

为了说明此行为,让我们通过向每个 foreach 迭代添加 print 语句来调试输出:

foreach ($arr as &$item) {
    echo "Item: $item<br>";
    print_r($arr);
    echo "<br>";
}

foreach ($arr as $item) {
    echo "Item: $item<br>";
    print_r($arr);
    echo "<br>";
}
登录后复制

此输出:

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

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

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

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

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

Item: bar
Array ( [0] => foo [1] => bar [2] => bar )
登录后复制

您可以清楚地看到$arr 设置为 $item 的值,该值在第二个 foreach 循环期间更改为数组的最后一个元素。

错误或预期行为?

This行为不是错误。这是通过引用传递的结果。 foreach 循环只是将当前元素的值分配给循环头中指定的变量。在本例中,通过引用 $item,我们在第二个循环中修改原始数组元素。这相当于以下代码:

for ($i = 0; $i < count($arr); $i++) {
    $arr[$i] = $item;
}
登录后复制

因此,观察到的行为不是错误,而是 PHP 中按引用传递的预期语义的结果。为了避免这种行为,请在第二个 foreach 循环中使用按值传递,只需将每个元素的值分配给 $item:foreach ($arr as $item)。

以上是为什么 PHP 的 Foreach 循环中的最后一个元素会通过引用传递而重复?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板