为什么在 PHP 的'foreach”循环中使用引用会导致意外的数组修改?
Dec 16, 2024 am 09:24 AM“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中文网其他相关文章!
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章
两个点博物馆:邦格荒地地点指南
4 周前
By 尊渡假赌尊渡假赌尊渡假赌
击败分裂小说需要多长时间?
3 周前
By DDD
仓库:如何复兴队友
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验?
3 周前
By 王林

热门文章
两个点博物馆:邦格荒地地点指南
4 周前
By 尊渡假赌尊渡假赌尊渡假赌
击败分裂小说需要多长时间?
3 周前
By DDD
仓库:如何复兴队友
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验?
3 周前
By 王林

热门文章标签

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)