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 相关文章推荐
3
Oct 09 PHP
十天学会php之第三天
Oct 09 PHP
PHP 命令行参数详解及应用
May 18 PHP
PHP中的cookie不用刷新就生效的方法
Feb 04 PHP
php导入csv文件碰到乱码问题的解决方法
Feb 10 PHP
php中的mongodb select常用操作代码示例
Sep 06 PHP
PHP调用MySQL存储过程并返回值的方法
Dec 26 PHP
smarty内置函数config_load用法实例
Jan 22 PHP
win平台安装配置Nginx+php+mysql 环境
Jan 12 PHP
提交表单后 PHP获取提交内容的实现方法
May 25 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
Oct 22 PHP
php7 参数、整形及字符串处理机制修改实例分析
May 25 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
window+nginx+php环境配置 附配置搭配说明
2010/12/29 PHP
PHP5.4中json_encode中文转码的变化小结
2013/01/30 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
PHP获取二维数组中某一列的值集合
2015/12/25 PHP
php实现的一段简单概率相关代码
2016/05/30 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
php用xpath解析html的代码实例讲解
2019/02/14 PHP
Laravel 解决composer相关操作提示php相关异常的问题
2019/10/23 PHP
javascript编程起步(第五课)
2007/01/10 Javascript
一些常用的JS功能函数代码
2009/06/23 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
解决layer弹出层的内容页点击按钮跳转到新的页面问题
2019/09/14 Javascript
vue引用外部JS的两种种方法
2020/01/28 Javascript
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
python主线程捕获子线程的方法
2018/06/17 Python
python多进程实现文件下载传输功能
2018/07/28 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
2018/11/06 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
2019/10/30 Python
python随机生成大小写字母数字混合密码(仅20行代码)
2020/02/01 Python
如何表示python中的相对路径
2020/07/08 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
CSS3的transition和animation的用法实例介绍
2014/08/20 HTML / CSS
阿玛尼美国官方网站:Armani.com
2016/11/25 全球购物
澳大利亚女士时装在线:Rockmans
2018/09/26 全球购物
生产车间主管岗位职责
2013/12/28 职场文书
中学教师培训制度
2014/01/31 职场文书
学生党员的自我评价范文
2014/03/01 职场文书
结婚保证书范文
2014/04/29 职场文书
山东省召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2014年信用社工作总结
2014/11/25 职场文书
汤姆索亚历险记读书笔记
2015/06/29 职场文书
python字符串的一些常见实用操作
2022/04/06 Python
Java 多态分析
2022/04/26 Java/Android