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

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

Dec 16, 2024 am 09:24 AM

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

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

热门文章

两个点博物馆:邦格荒地地点指南
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章

两个点博物馆:邦格荒地地点指南
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章标签

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

11个最佳PHP URL缩短脚本(免费和高级) 11个最佳PHP URL缩短脚本(免费和高级) Mar 03, 2025 am 10:49 AM

11个最佳PHP URL缩短脚本(免费和高级)

在Laravel中使用Flash会话数据 在Laravel中使用Flash会话数据 Mar 12, 2025 pm 05:08 PM

在Laravel中使用Flash会话数据

6个额外的技能,每个PHP开发人员都应该拥有 6个额外的技能,每个PHP开发人员都应该拥有 Feb 28, 2025 am 10:52 AM

6个额外的技能,每个PHP开发人员都应该拥有

了解PHP中的阵列 了解PHP中的阵列 Feb 28, 2025 am 10:53 AM

了解PHP中的阵列

构建具有Laravel后端的React应用程序:第2部分,React 构建具有Laravel后端的React应用程序:第2部分,React Mar 04, 2025 am 09:33 AM

构建具有Laravel后端的React应用程序:第2部分,React

简化的HTTP响应在Laravel测试中模拟了 简化的HTTP响应在Laravel测试中模拟了 Mar 12, 2025 pm 05:09 PM

简化的HTTP响应在Laravel测试中模拟了

在Codecanyon上的12个最佳PHP聊天脚本 在Codecanyon上的12个最佳PHP聊天脚本 Mar 13, 2025 pm 12:08 PM

在Codecanyon上的12个最佳PHP聊天脚本

php中的卷曲:如何在REST API中使用PHP卷曲扩展 php中的卷曲:如何在REST API中使用PHP卷曲扩展 Mar 14, 2025 am 11:42 AM

php中的卷曲:如何在REST API中使用PHP卷曲扩展

See all articles