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 相关文章推荐
基于mysql的论坛(1)
Oct 09 PHP
PHP 飞信好友免费短信API接口开源版
Jul 22 PHP
php文件夹与文件目录操作函数介绍
Sep 09 PHP
PHP统计目录中文件以及目录中目录大小的方法
Jan 09 PHP
PHP访问数据库集群的方法小结
Mar 14 PHP
mysql alter table命令修改表结构实例详解
Sep 24 PHP
PHP实现的常规正则验证helper公共类完整实例
Apr 27 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
May 23 PHP
php微信公众号开发之音乐信息
Oct 20 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
Jan 23 PHP
php的RSA加密解密算法原理与用法分析
Jan 23 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 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微信开发之上传临时素材
2016/06/24 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
JS Timing
2007/04/21 Javascript
js 第二代身份证号码的验证机制代码
2011/05/12 Javascript
jquery实现固定顶部导航效果(仿蘑菇街)
2013/03/21 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
2014/10/17 Javascript
jquery模拟进度条实现方法
2015/08/03 Javascript
配置Grunt的Task时通配符支持和动态生成文件名问题
2015/09/06 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
2016/03/24 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
vue 项目如何引入微信sdk接口的方法
2017/12/18 Javascript
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
2019/05/16 Javascript
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
2019/11/12 Javascript
python协程用法实例分析
2015/06/04 Python
详解Python3的TFTP文件传输
2018/06/26 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
Python学习笔记之lambda表达式用法详解
2019/08/08 Python
用Python去除图像的黑色或白色背景实例
2019/12/12 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
2020/02/12 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
解决import tensorflow as tf 出错的原因
2020/04/16 Python
python3发送request请求及查看返回结果实例
2020/04/30 Python
python中如何设置代码自动提示
2020/07/15 Python
解决Windows下python和pip命令无法使用的问题
2020/08/31 Python
投标邀请书范文
2014/01/31 职场文书
《小山羊和小灰兔》教学反思
2014/02/19 职场文书
课内比教学心得体会
2014/09/09 职场文书
大型主题婚礼活动策划方案
2014/09/15 职场文书
高三毕业感言
2015/07/30 职场文书
go xorm框架的使用
2021/05/22 Golang
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android
MySQL命令无法输入中文问题的解决方式
2021/08/30 MySQL