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 相关文章推荐
一个取得文件扩展名的函数
Oct 09 PHP
PHP计算一年多少个星期和每周的开始和结束日期
Jul 01 PHP
PHP使用redis实现统计缓存mysql压力的方法
Nov 14 PHP
header与缓冲区之间的深层次分析
Jul 30 PHP
PHP GD库相关图像生成和处理函数小结
Sep 30 PHP
PHP实现Google plus的好友拖拽分组效果
Oct 21 PHP
完美解决在ThinkPHP控制器中命名空间的问题
May 05 PHP
PHP单例模式与工厂模式详解
Aug 29 PHP
PHP中OpenSSL加密问题整理
Dec 14 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
Mar 01 PHP
PHP实现数据四舍五入的方法小结【4种方法】
Mar 27 PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 27 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
德生PL550的电路分析
2021/03/02 无线电
劣质的PHP代码简化
2010/02/08 PHP
php快速url重写更新版[需php 5.30以上]
2010/04/25 PHP
如何修改和添加Apache的默认站点目录
2013/07/05 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
2014/11/04 PHP
PDO::setAttribute讲解
2019/01/29 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
浅谈javascript 面向对象编程
2009/10/28 Javascript
jQuery 入门级学习笔记及源码
2010/01/22 Javascript
Raphael一个用于在网页中绘制矢量图形的Javascript库
2013/01/08 Javascript
多种方式实现JS调用后台方法进行数据交互
2013/08/20 Javascript
浅析JavaScript中的同名标识符优先级
2013/12/06 Javascript
JS替换字符串中字符即替换全部而不是第一个
2014/06/04 Javascript
JS组件Bootstrap Table表格行拖拽效果实现代码
2020/08/27 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
Angular和百度地图的结合实例代码
2016/10/19 Javascript
JS重载实现方法分析
2016/12/16 Javascript
JS二分查找算法详解
2017/11/01 Javascript
vue 运用mock数据的示例代码
2017/11/07 Javascript
vue中eslintrc.js配置最详细介绍
2018/12/21 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
2020/09/10 Javascript
[46:09]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第三场
2014/05/26 DOTA
matplotlib作图添加表格实例代码
2018/01/23 Python
详解python中的线程
2018/02/10 Python
深入理解Django-Signals信号量
2019/02/19 Python
解决python-docx打包之后找不到default.docx的问题
2020/02/13 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
2020/03/27 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
Vinatis德国:法国领先的葡萄酒邮购公司
2020/09/07 全球购物
电厂厂长岗位职责
2014/01/02 职场文书
思想汇报格式
2014/01/05 职场文书
单位未婚证明范本
2014/01/18 职场文书
成语的广告词
2014/03/19 职场文书
传承焦裕禄精神思想汇报2014
2014/09/10 职场文书
学习型家庭事迹材料
2014/12/20 职场文书
Python Pytorch查询图像的特征从集合或数据库中查找图像
2022/04/09 Python