首页 > 后端开发 > php教程 > 为什么在 PHP 的'foreach”循环中使用引用会导致意外的数组修改?

为什么在 PHP 的'foreach”循环中使用引用会导致意外的数组修改?

Linda Hamilton
发布: 2024-12-16 09:24:17
原创
382 人浏览过

Why Does Using References in PHP's `foreach` Loop Lead to Unexpected Array Modifications?

“foreach”循环中的引用行为:了解数组修改

在 PHP 中,在“foreach”循环中使用引用可能会导致意外的结果数组修改。此行为在以下代码中突出显示:

$a = array('a', 'b', 'c', 'd');

foreach ($a as &$v) { }
foreach ($a as $v) { }

print_r($a);
登录后复制

此代码生成的输出是意外的:

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => c
)
登录后复制

分步说明

要理解这种行为,必须跟踪“foreach”每次迭代期间发生的变化循环:

  • 第一次迭代(参考迭代): $v 是对 $a[0] ('a') 的引用。
  • 第二次迭代(参考迭代): $v 是对 $a[1] 的引用('b').
  • 第三次迭代(参考迭代): $v 是对 $a[2] ('c') 的引用。
  • 第四次迭代(参考迭代): $v 是对 $a[3] 的引用('d').

完成第一个 'foreach' 循环(引用迭代)后,$v 仍然保留对 $a[3] ('d') 的引用。

  • 第一次迭代(值迭代): $v (仍然引用 $a[3])被分配的值$a[0]('a')。但是,由于 $v 是引用,因此它将 $a[3] 修改为 'a'。
  • 第二次迭代(值迭代): $v (仍然引用 $a[3] ) 被赋予 $a[1] ('b') 的值。这再次将 $a[3] 修改为 'b'。
  • 第三次迭代(值迭代): $v (仍然引用 $a[3])被分配 $a 的值[2]('c')。这将 $a[3] 再次修改为 'c'。
  • 第四次迭代(值迭代): $v (仍然引用 $a[3])被分配 $ 的值a[3] ('c').

因此,在第二个“foreach”循环(值迭代)之后,数组$a 已被修改,'c' 出现了两次。

解决问题

为了避免这种意外行为,建议在每次迭代后取消设置引用:

$a = array('a', 'b', 'c', 'd');

foreach ($a as &$v) { }
unset($v);
foreach ($a as $v) { }

print_r($a);
登录后复制

这将产生预期的输出:

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
)
登录后复制

以上是为什么在 PHP 的'foreach”循环中使用引用会导致意外的数组修改?的详细内容。更多信息请关注PHP中文网其他相关文章!

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