PHP中Foreach在引用时的陷阱
<?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在引用时的陷阱相关推荐
- 浅析C#中foreach引用变量
昨天做老师的网站作业.要对一些对象做添加修改删除处理.别的倒没什么,删除时出现了点问题似的. 因为是从一个类的集合中删除掉一个元素.这样就要遍历整个集合,而foreach正是为遍历准备的新玩意.自然而 ...
- 引用wx.getclipboarddata中的内容_教材、图书在引用时要注意哪些方面
不管你是在专著上还是在教材.图书以及创作中我们多多少少都会有引用,引用会使论据确凿充分,增强说服力,富启发性,而且语言精炼,含蓄典雅,同时它能 以表达自己想要表达的思想感情,说明自己对新问题.新道理的 ...
- 你真的懂ArrayList吗?说说foreach与iterator时remove的区别
文章目录 1. ArrayList 和 LinkedList的区别 1.1 CopyOnWriteArrayList怎么保证线程安全? 1.2 Vector.ArrayList.LinkedList的 ...
- 性能测试之JMeter中ForEach控制器详解
1.什么是逻辑控制器 JMeter官网对逻辑控制器的解释是:"Logic Controllers determine the order in which Samplers are proc ...
- 使用指针时的“陷阱”
使用指针时的"陷阱" "C语言诡异离奇,陷阱重重,却获得了巨大成功!"--C语言之父Dennis M.Ritchie.Ritchie大师的这句话体现了C语言的灵 ...
- 通过薄膜太阳能电池中的热激电流量化陷阱状态
什么是陷阱状态,我们为什么要关心它们? 发光(led)和光伏(PV)器件的性能取决于光活性半导体材料的质量.由于材料杂质或在制造过程中在半导体材料中无意地引入缺陷,导致偏离最佳性能. 这些缺陷被称为阱 ...
- Js中forEach,for in,for of循环的用法
取出数组里边对象的key和value值: 取出数组里边对象的key和value值_chu_geng的博客-CSDN博客_获取数组里面对象的value值 转自:js中forEach,for in,for ...
- Unity中的资源管理-引用计数
本文分享Unity中的资源管理-引用计数 在前面的文章中, 我们一起学习了对象池的基本原理和几种实现, 今天和大家继续聊聊另一个资源管理中比较重要的技术: 引用计数. GC的基础知识 GC(Garba ...
- php foreach嵌套foreach,php中foreach怎么嵌套foreach PHP中foreach函数用法?
foreach的使用方法小编不是很明确,分享达人指教一下.foreach (array_expressforeach($array as $key) { if(xxxx) { break; //bre ...
最新文章
- 多线程--GCD的基本用法
- python为什么用号做注释符_Python为什么用#号作注释符?
- 机器学习(五)——缓解过拟合
- 数据库面试题【十八、优化关联查询优化子查询优化LIMIT分页优化UNION查询优化WHERE子句】
- mysql 5.7 速度很快_MySQL5.7速度比MySQL5.6快3倍
- SP1043 GSS1 - Can you answer these queries I 猫树
- KVM热迁移方式漫谈
- Android中关于Adapter的使用(下)BaseAdapter
- Android 获取当天零点的毫秒值并将时间格式化
- 基于区块链的融合通信初探(一)
- C# 身份证号码验证正则和验证函数
- AWK awk xxx xxx
- python---exception handing and testing
- matlab 根轨迹 系统单位阶跃响应,二阶系统单位阶跃响应MATLAB仿真设计.doc
- JavaScript点击图片加上红色边框
- 火狐开发----Web开发者工具
- 0.进校的第一张Excel表:“住宿分布表” ——《Excel“智能化”之路》 系列文章
- 笔记本连WiFi共享网络给台式机 Ubuntu
- 2018年校招深睿医疗面试
- 使用matlab处理.nii图像
热门文章
- mybatis映射多对多查询实现
- Codeforces Round #192 (Div. 1) A. Purification 贪心
- 用正则表达式抽取文本
- iOS中网络请求的使用(GET请求与POST请求)
- MFC和Direct3D9一起使用
- 20140505 科技脉搏 - “社交”这棵老树,依然在开着新花
- python 赋值操作的知识点
- 我国.NET域名注册总量超57.3万 6月新增6747个
- linux-shell面试题
- 《Supervised Descent Method and its Applications to Face Alignment》阅读笔记