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 解决utf-8和gb2312编码转换问题
Mar 18 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
Aug 21 PHP
eaglephp使用微信api接口开发微信框架
Jan 09 PHP
php读取csc文件并输出
May 21 PHP
PHP单例模式是什么 php实现单例模式的方法
May 14 PHP
php实现登录tplink WR882N获取IP和重启的方法
Jul 20 PHP
Ajax中的JSON格式与php传输过程全面解析
Nov 14 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 PHP
php取出数组单个值的方法
Mar 12 PHP
PHP进阶学习之Geo的地图定位算法详解
Jun 19 PHP
PHP使用Session实现上传进度功能详解
Aug 06 PHP
php写入mysql中文乱码的实例解决方法
Sep 17 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调用三种数据库的方法(1)
2006/10/09 PHP
PHP 5.0 Pear安装方法
2006/12/06 PHP
PHP字符串长度计算 - strlen()函数使用介绍
2013/10/15 PHP
PHP中source #N问题的解决方法
2014/01/27 PHP
php实现文件下载功能的几个代码分享
2014/05/10 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
jquery 提示信息显示后自动消失的具体实现
2013/12/18 Javascript
JSON格式化输出
2014/11/10 Javascript
JavaScript判断IE版本型号
2015/07/27 Javascript
JS实现浏览器状态栏显示时间的方法
2015/10/27 Javascript
JavaScript获取浏览器信息的方法
2015/11/20 Javascript
JS判断是否在微信浏览器打开的简单实例(推荐)
2016/08/24 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
textarea 在浏览器中固定大小和禁止拖动的实现方法
2016/12/03 Javascript
JS控件bootstrap datepicker使用方法详解
2017/03/25 Javascript
微信小程序实现列表下拉刷新上拉加载
2020/07/29 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
2018/08/10 Javascript
Node.js如何对SQLite的async/await封装详解
2019/02/14 Javascript
vuex 动态注册方法 registerModule的实现
2019/07/03 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
Vue性能优化的方法
2020/07/30 Javascript
Swiper实现导航栏滚动效果
2020/10/16 Javascript
python Socket之客户端和服务端握手详解
2017/09/18 Python
利用Django提供的ModelForm增删改数据的方法
2019/01/06 Python
python实现局域网内实时通信代码
2019/12/22 Python
手把手教你进行Python虚拟环境配置教程
2020/02/03 Python
python实现文法左递归的消除方法
2020/05/22 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
2021/02/25 Python
美国购买体育赛事门票网站:TicketCity
2019/03/06 全球购物
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
印度电子产品购物网站:Vijay Sales
2021/02/16 全球购物
网上卖盒饭创业计划书范文
2014/02/07 职场文书
汽车维修工岗位职责
2014/02/12 职场文书
教师先进事迹材料
2014/12/16 职场文书
个人先进事迹总结
2015/02/26 职场文书
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python