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 相关文章推荐
用PHP4访问Oracle815
Oct 09 PHP
一个PHP日历程序
Dec 06 PHP
解析php中die(),exit(),return的区别
Jun 20 PHP
使用PHP实现Mysql读写分离
Jun 28 PHP
destoon安全设置中需要设置可写权限的目录及文件
Jun 21 PHP
配置php.ini实现PHP文件上传功能
Nov 27 PHP
PHP获取服务器端信息的方法
Nov 28 PHP
详解PHP序列化反序列化的方法
Oct 27 PHP
PHP中substr函数字符串截取用法分析
Jan 07 PHP
浅谈PHP中的
Apr 23 PHP
利用Laravel生成Gravatar头像地址的优雅方法
Dec 30 PHP
小程序微信退款功能实现方法详解【基于thinkPHP】
May 05 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与C#分别格式化文件大小的代码
2011/05/14 PHP
php中get_defined_constants函数用法实例分析
2015/05/12 PHP
将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
2016/03/03 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
php实现统计二进制中1的个数算法示例
2018/01/23 PHP
Gird组件 Part-3:范例RSSFeed Viewer
2007/03/10 Javascript
自写简单JS判断是否已经弹出页面
2010/10/20 Javascript
JS 控制小数位数的实现代码
2011/08/02 Javascript
jquery 列表双向选择器之改进版
2013/08/09 Javascript
js中的this关键字详解
2013/09/25 Javascript
Javascript中的String对象详谈
2014/03/03 Javascript
Javascript中arguments和arguments.callee的区别浅析
2015/04/24 Javascript
JS hashMap实例详解
2016/05/26 Javascript
基于AGS JS开发自定义贴图图层
2017/03/31 Javascript
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
小程序实现列表点赞功能
2018/11/02 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
[42:20]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python中多线程的创建及基本调用方法
2016/07/08 Python
python网络编程 使用UDP、TCP协议收发信息详解
2019/08/29 Python
Django使用消息提示简单的弹出个对话框实例
2019/11/15 Python
详解python中GPU版本的opencv常用方法介绍
2020/07/24 Python
Python如何爬取51cto数据并存入MySQL
2020/08/25 Python
python中操作文件的模块的方法总结
2021/02/04 Python
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
创业计划实施的7大步骤
2014/02/05 职场文书
销售员个人求职的自我评价
2014/02/10 职场文书
整改报告怎么写
2014/11/06 职场文书
幼儿园辞职书
2015/02/26 职场文书
公司财务部岗位职责
2015/04/14 职场文书
大学军训通讯稿
2015/07/18 职场文书
创业计划书之烤红薯
2019/09/26 职场文书
如何用PHP实现分布算法之一致性哈希算法
2021/05/26 PHP
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers