这个陷阱在PHP里存在很久了,先看代码:

<?php
$array = array(1, 2, 3);

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

print_r($array);
?>

运行代码,得到的结果却是:
Array
(
[0] => 1
[1] => 2
[2] => 2
)可以发现,经过两次foreach后,最后一个元素由3变成了2。

为什么会这样呢?这是因为第一次foreach的时候$v成为了一个引用变量($array[2]),如此,当第二次foreach的时候,实际上只是在对这个引用变量($array[2])进行了若干次赋值而已。

第一次:$array[2] = 1,此时$array各元素分别为1,2,1
第二次:$array[2] = 2,此时$array各元素分别为1,2,2
第二次:$array[2] = 2,此时$array各元素分别为1,2,2

一不小心很可能会掉入这个陷阱,为了避免这个问题,需要在第一次foreach后执行unset($v),解决方案有点丑陋,但也没有办法,PHP脚本里的变量一旦生成就在整个脚本中有效,不像Java中,变量是块级别的,仅仅在对应的{}中有效。

PHP的Bug系统里能看到关于这个这个问题的链接,不过从04年提出这个问题到现在已经四年了,估计PHP团队不会解决这个问题了。也是,从PHP的脚本特性来说这也可以说不是Bug,只是苦了我们这些程序员,要多加小心了。

转载于:https://www.cnblogs.com/jshen/archive/2013/01/05/2845290.html

PHP中Foreach在引用时的陷阱相关推荐

  1. 浅析C#中foreach引用变量

    昨天做老师的网站作业.要对一些对象做添加修改删除处理.别的倒没什么,删除时出现了点问题似的. 因为是从一个类的集合中删除掉一个元素.这样就要遍历整个集合,而foreach正是为遍历准备的新玩意.自然而 ...

  2. 引用wx.getclipboarddata中的内容_教材、图书在引用时要注意哪些方面

    不管你是在专著上还是在教材.图书以及创作中我们多多少少都会有引用,引用会使论据确凿充分,增强说服力,富启发性,而且语言精炼,含蓄典雅,同时它能 以表达自己想要表达的思想感情,说明自己对新问题.新道理的 ...

  3. 你真的懂ArrayList吗?说说foreach与iterator时remove的区别

    文章目录 1. ArrayList 和 LinkedList的区别 1.1 CopyOnWriteArrayList怎么保证线程安全? 1.2 Vector.ArrayList.LinkedList的 ...

  4. 性能测试之JMeter中ForEach控制器详解

    1.什么是逻辑控制器 JMeter官网对逻辑控制器的解释是:"Logic Controllers determine the order in which Samplers are proc ...

  5. 使用指针时的“陷阱”

    使用指针时的"陷阱" "C语言诡异离奇,陷阱重重,却获得了巨大成功!"--C语言之父Dennis M.Ritchie.Ritchie大师的这句话体现了C语言的灵 ...

  6. 通过薄膜太阳能电池中的热激电流量化陷阱状态

    什么是陷阱状态,我们为什么要关心它们? 发光(led)和光伏(PV)器件的性能取决于光活性半导体材料的质量.由于材料杂质或在制造过程中在半导体材料中无意地引入缺陷,导致偏离最佳性能. 这些缺陷被称为阱 ...

  7. Js中forEach,for in,for of循环的用法

    取出数组里边对象的key和value值: 取出数组里边对象的key和value值_chu_geng的博客-CSDN博客_获取数组里面对象的value值 转自:js中forEach,for in,for ...

  8. Unity中的资源管理-引用计数

    本文分享Unity中的资源管理-引用计数 在前面的文章中, 我们一起学习了对象池的基本原理和几种实现, 今天和大家继续聊聊另一个资源管理中比较重要的技术: 引用计数. GC的基础知识 GC(Garba ...

  9. php foreach嵌套foreach,php中foreach怎么嵌套foreach PHP中foreach函数用法?

    foreach的使用方法小编不是很明确,分享达人指教一下.foreach (array_expressforeach($array as $key) { if(xxxx) { break; //bre ...

最新文章

  1. 多线程--GCD的基本用法
  2. python为什么用号做注释符_Python为什么用#号作注释符?
  3. 机器学习(五)——缓解过拟合
  4. 数据库面试题【十八、优化关联查询优化子查询优化LIMIT分页优化UNION查询优化WHERE子句】
  5. mysql 5.7 速度很快_MySQL5.7速度比MySQL5.6快3倍
  6. SP1043 GSS1 - Can you answer these queries I 猫树
  7. KVM热迁移方式漫谈
  8. Android中关于Adapter的使用(下)BaseAdapter
  9. Android 获取当天零点的毫秒值并将时间格式化
  10. 基于区块链的融合通信初探(一)
  11. C# 身份证号码验证正则和验证函数
  12. AWK awk xxx xxx
  13. python---exception handing and testing
  14. matlab 根轨迹 系统单位阶跃响应,二阶系统单位阶跃响应MATLAB仿真设计.doc
  15. JavaScript点击图片加上红色边框
  16. 火狐开发----Web开发者工具
  17. 0.进校的第一张Excel表:“住宿分布表” ——《Excel“智能化”之路》 系列文章
  18. 笔记本连WiFi共享网络给台式机 Ubuntu
  19. 2018年校招深睿医疗面试
  20. 使用matlab处理.nii图像

热门文章

  1. mybatis映射多对多查询实现
  2. Codeforces Round #192 (Div. 1) A. Purification 贪心
  3. 用正则表达式抽取文本
  4. iOS中网络请求的使用(GET请求与POST请求)
  5. MFC和Direct3D9一起使用
  6. 20140505 科技脉搏 - “社交”这棵老树,依然在开着新花
  7. python 赋值操作的知识点
  8. 我国.NET域名注册总量超57.3万 6月新增6747个
  9. linux-shell面试题
  10. 《Supervised Descent Method and its Applications to Face Alignment》阅读笔记