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 Squid中可缓存的动态网页设计
Sep 17 PHP
PHP is_dir() 判断给定文件名是否是一个目录
May 10 PHP
PHP无法访问远程mysql的问题分析及解决
May 16 PHP
一款简单实用的php操作mysql数据库类
Dec 08 PHP
从wamp到xampp的升级之路
Apr 08 PHP
php通过两层过滤获取留言内容的方法
Jul 11 PHP
详解EventDispatcher事件分发组件
Dec 25 PHP
thinkphp中的多表关联查询的实例详解
Oct 12 PHP
PHP实现的简单路由和类自动加载功能
Mar 13 PHP
PHP根据key删除数组中指定的元素
Feb 28 PHP
Thinkphp5框架使用validate实现验证功能的方法
Aug 27 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
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
网站当前的在线人数
2006/10/09 PHP
PHP+MySQL5.0中文乱码解决方法
2006/11/20 PHP
初学CAKEPHP 基础教程
2009/11/02 PHP
实例讲解PHP页面静态化
2018/02/05 PHP
微信支付之JSAPI公众号支付详解
2019/05/15 PHP
漂亮的thinkphp 跳转页封装示例
2019/10/16 PHP
用js实现下载远程文件并保存在本地的脚本
2008/05/06 Javascript
jQuery的一些特性和用法整理小结
2010/01/13 Javascript
使用jQuery的将桌面应用程序引入浏览器
2010/11/19 Javascript
js中window.open()的所有参数详细解析
2014/01/09 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
JavaScript不刷新实现浏览器的前进后退功能
2014/11/05 Javascript
jQuery实现多按钮单击变色
2014/11/27 Javascript
jQuery中filter()方法用法实例
2015/01/06 Javascript
jquery实现聚光灯效果的方法
2015/02/06 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
js实现固定宽高滑动轮播图效果
2017/01/13 Javascript
理解javascript中的Function.prototype.bind的方法
2017/02/03 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
2017/07/24 Javascript
基于js Canvas实现二次贝塞尔曲线
2018/12/25 Javascript
说说如何使用Vuex进行状态管理(小结)
2019/04/14 Javascript
angular多语言配置详解
2019/05/16 Javascript
JS实现可视化音频效果的实例代码
2020/01/16 Javascript
Python实现将目录中TXT合并成一个大TXT文件的方法
2015/07/15 Python
python实现外卖信息管理系统
2018/01/11 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
2016/03/15 HTML / CSS
劳力士官方珠宝商:J.R. Dunn Jewelers
2018/09/29 全球购物
医学生实习自我鉴定
2013/09/27 职场文书
大学生职业生涯规划书模板
2014/01/18 职场文书
幼儿园实习生辞职信
2014/01/20 职场文书
医学专业自荐信
2014/06/14 职场文书
工作证明格式及范本
2014/09/12 职场文书
领导干部作风建设总结
2014/10/23 职场文书
暑期社会实践个人总结
2015/03/06 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书