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函数
Jan 11 PHP
php 读取shell管道传输过来的内容
Mar 01 PHP
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
Jul 31 PHP
基于php和mysql的简单的dao类实现crud操作功能
Jan 27 PHP
php表单请求获得数据求和示例
May 15 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
Jun 23 PHP
php 批量查询搜狗sogou代码分享
May 17 PHP
PHP实现清除wordpress里恶意代码
Oct 21 PHP
一个简单至极的PHP缓存类代码
Oct 23 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
Jul 18 PHP
使用laravel根据用户类型来显示或隐藏字段
Oct 17 PHP
基于PHP实现短信验证码发送次数限制
Jul 11 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
destoon实现会员商铺中指定会员或会员组投放广告的方法
2014/08/21 PHP
php异步多线程swoole用法实例
2014/11/14 PHP
Yii实现复选框批量操作实例代码
2017/03/15 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
html5 canvas js(数字时钟)实例代码
2013/12/23 Javascript
浅析Node.js查找字符串功能
2014/09/03 Javascript
jquery分页插件jquery.pagination.js使用方法解析
2016/04/01 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
JavaScript常见的五种数组去重的方式
2016/12/15 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
JavaScript之json_动力节点Java学院整理
2017/06/29 Javascript
JS实现去除数组中重复json的方法示例
2017/12/21 Javascript
详解通过源码解析Node.js中cluster模块的主要功能实现
2018/05/16 Javascript
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
JavaScript Canvas实现验证码
2020/08/02 Javascript
VUE+Element环境搭建与安装的方法步骤
2019/01/24 Javascript
vue 导航内容设置选中状态样式的例子
2019/11/01 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
vue项目中使用bpmn-自定义platter的示例代码
2020/05/11 Javascript
使用next.js开发网址缩短服务的方法
2020/06/17 Javascript
python 实现堆排序算法代码
2012/06/05 Python
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
Python图像处理之识别图像中的文字(实例讲解)
2018/05/10 Python
浅谈python中对于json写入txt文件的编码问题
2018/06/07 Python
python实现知乎高颜值图片爬取
2019/08/12 Python
Python 处理文件的几种方式
2019/08/23 Python
基于python实现把图片转换成素描
2019/11/13 Python
新奇的小玩意:IWOOT
2016/07/21 全球购物
公司周年庆典标语
2014/10/07 职场文书
个人房屋转让协议书范本
2014/10/26 职场文书
工作检讨书大全
2015/01/26 职场文书
语文教师个人工作总结
2015/02/06 职场文书
2015年团支书工作总结
2015/04/03 职场文书
婚宴父亲致辞
2015/07/27 职场文书
python pygame入门教程
2021/06/01 Python
python中 Flask Web 表单的使用方法
2022/05/20 Python