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读取IMAP邮件
Oct 09 PHP
精通php的十大要点(上)
Feb 04 PHP
PHP 超链接 抓取实现代码
Jun 29 PHP
php代码中使用换行及(\n或\r\n和br)的应用
Feb 02 PHP
php截取字符串并保留完整xml标签的函数代码
Feb 06 PHP
php加密解密实用类分享
Jan 07 PHP
PHP防盗链代码实例
Aug 27 PHP
PHP获取服务器端信息的方法
Nov 28 PHP
php数据结构之顺序链表与链式线性表示例
Jan 22 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
Aug 27 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
Sep 12 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 COOKIE及时生效的方法介绍
2014/02/14 PHP
php简单实现查询数据库返回json数据
2015/04/16 PHP
Yii中创建自己的Widget实例
2016/01/05 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
2016/04/28 PHP
php的RSA加密解密算法原理与用法分析
2020/01/23 PHP
为jQuery增加join方法的实现代码
2010/11/28 Javascript
Web跨浏览器进程通信(Web跨域)
2013/04/17 Javascript
使用js对select动态添加和删除OPTION示例代码
2013/08/12 Javascript
JS实现定时页面弹出类似QQ新闻的提示框
2013/11/07 Javascript
JS烟花背景效果实现方法
2015/03/03 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
2015/07/27 Javascript
JavaScript实现向右伸出的多级网页菜单效果
2015/08/25 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
JS判断iframe是否加载完成的方法
2016/08/03 Javascript
使用JQuery中的trim()方法去掉前后空格
2016/09/16 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
JS数组求和的常用方法实例小结
2019/01/07 Javascript
puppeteer库入门初探
2019/01/09 Javascript
微信公众平台获取access_token的方法步骤
2019/03/29 Javascript
Layui Form 自定义验证的实例代码
2019/09/14 Javascript
python Django模板的使用方法(图文)
2013/11/04 Python
python获取标准北京时间的方法
2015/03/24 Python
Python类的继承和多态代码详解
2017/12/27 Python
python列表生成器迭代器实例解析
2019/12/19 Python
Python JSON常用编解码方法代码实例
2020/09/05 Python
优衣库台湾官网:UNIQLO台湾
2019/02/01 全球购物
追悼会主持词
2014/03/20 职场文书
创先争优个人总结
2015/03/04 职场文书
2015年会计个人工作总结
2015/04/02 职场文书
毕业典礼致辞
2015/07/29 职场文书
公司晚宴祝酒词
2015/08/11 职场文书
SpringDataJPA在Entity中常用的注解介绍
2021/12/06 Java/Android
Python实战之大鱼吃小鱼游戏的实现
2022/04/01 Python
python数字图像处理实现图像的形变与缩放
2022/06/28 Python