php foreach 使用&(与运算符)引用赋值要注意的问题


Posted in PHP onFebruary 16, 2010

foreach 通过在 $value 之前加上 & 很容易就能修改数组的单元,如:

PHP代码

foreach($arr as $value){ 
$value .= '4'; 
}

但这个用法也很容易造成错误,而且也不容易找。

看例子更直截了当:

PHP代码

<?php 
$arr = array('a','b','c'); 
$arr2 = array('d', 'e', 'f'); foreach($arr as $value){//习惯用$value或$val 
$value .= '4'; 
} 
//都处理完毕我们在页面模版输出,首先输出$arr2 
foreach($arr2 as $value){//习惯用$value或$val 
//echo $value; 
} 
//然后再这样输出 $arr; 
foreach($arr as $value){//习惯用$value或$val 
echo $value, "\n"; 
} 
?>

大家看看输出的结果是否和期望的一样。这里结果是:
XML/HTML代码 
a4 
b4 
b4

结果和我期待的不一样,这个就是引用引起的问题。

在 foreach($arr as &$value) 数组遍历到最后,引用关系并没有断开,这是等同于 $value 与 $arr 的最后一个单元即 $arr[2] 引用。

再到 foreach($arr2 as $value),$value的值一直随数组单元的值变,由于引用关系没有断开,$arr[2] 的值也跟着变化。一直到$arr2遍历完,这是$value的值为f,所以$arr[2]值也为f。
这时$arr的值应为:

XML/HTML代码

Array 
( 
[0] => a4 
[1] => b4 
[2] => f 
)

这个和我们看到的最终输出结果又不一样。再到 foreach($arr as $value),同理,这时 $arr[2]的值也随着 $value 变化,当遍历到key为1,即$arr[1]时,$arr[2]的值也变成 $arr[1] 的值,即是 b4。然后再遍历到key为2时 $arr[2]的值又成了 $arr[2] 的值,也就是 b4 了。就是输出时的结果。

所以在 foreach 使用引用时要注意了。也可以在处理完后立即断开引用关系,后面就不会有上述情况了。

PHP代码

foreach($arr as $value){ 
$value .= '4'; 
} 
unset($value);
PHP 相关文章推荐
PHP开发大型项目的一点经验
Oct 09 PHP
php下实现折线图效果的代码
Apr 28 PHP
php SQL之where语句生成器
Mar 24 PHP
php5 图片验证码实现代码
Dec 11 PHP
destoon安装出现Internal Server Error的解决方法
Jun 21 PHP
thinkphp常见路径用法分析
Dec 02 PHP
php实现复制移动文件的方法
Jul 29 PHP
CI映射(加载)数据到view层的方法
Mar 28 PHP
PHP数学运算与数据处理实例分析
Apr 01 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
PHP对象实例化单例方法
Jan 19 PHP
laravel实现按时间日期进行分组统计方法示例
Mar 23 PHP
PHP 截取字符串函数整理(支持gb2312和utf-8)
Feb 16 #PHP
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
Feb 16 #PHP
一步一步学习PHP(6) 面向对象
Feb 16 #PHP
一步一步学习PHP(5) 类和对象
Feb 16 #PHP
php 生成静态页面的办法与实现代码详细版
Feb 15 #PHP
IP138 IP地址查询小偷实现代码
Feb 15 #PHP
PHP采集相关教程之一 CURL函数库
Feb 15 #PHP
You might like
PHP新手上路(九)
2006/10/09 PHP
ionCube 一款类似zend的PHP加密/解密工具
2010/07/25 PHP
CI框架中libraries,helpers,hooks文件夹详细说明
2014/06/10 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
2020/08/06 PHP
50个优秀经典PHP算法大集合 附源码
2020/08/26 PHP
javascript删除option选项的多种方法总结
2013/11/22 Javascript
js判断元素是否隐藏的方法
2014/06/09 Javascript
jquery.validate使用详解
2016/06/02 Javascript
javascript动画之模拟拖拽效果篇
2016/09/26 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
js实现视图和数据双向绑定的方法分析
2020/02/05 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
2020/05/10 Javascript
vue3.0中使用element的完整步骤
2021/03/04 Vue.js
Python Requests安装与简单运用
2016/04/07 Python
python+selenium实现登录账户后自动点击的示例
2017/12/22 Python
Tensorflow 合并通道及加载子模型的方法
2018/07/26 Python
python使用epoll实现服务端的方法
2018/10/16 Python
Django框架之登录后自定义跳转页面的实现方法
2019/07/18 Python
在PyTorch中Tensor的查找和筛选例子
2019/08/18 Python
Python timer定时器两种常用方法解析
2020/01/20 Python
python程序文件扩展名知识点详解
2020/02/27 Python
python字符串的index和find的区别详解
2020/06/20 Python
Html5实现移动端、PC端 刮刮卡效果
2016/06/30 HTML / CSS
美国名表在线商城:Ashford(支持中文)
2019/09/24 全球购物
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
中餐厅主管的职责范文
2014/02/04 职场文书
大三学生做职业规划:给未来找个方向
2014/02/24 职场文书
会计的岗位职责
2014/03/15 职场文书
客户经理竞聘演讲稿
2014/05/15 职场文书
校优秀毕业生主要事迹
2014/05/26 职场文书
单位委托书怎么写
2014/09/21 职场文书
2014年最新版离婚协议书范本
2014/11/25 职场文书
2016五一手机促销广告语
2016/01/28 职场文书
创业计划书之酒店
2019/08/30 职场文书
解决Golang中goroutine执行速度的问题
2021/05/02 Golang