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下实现农历日历的代码
Mar 07 PHP
PHP运行时强制显示出错信息的代码
Apr 20 PHP
有关php运算符的知识大全
Nov 03 PHP
PHP多例模式介绍
Jun 24 PHP
PHP中if和or运行效率对比
Dec 12 PHP
基于php的CMS中展示文章类实例分析
Jun 18 PHP
CI框架简单邮件发送类实例
May 18 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
Jul 27 PHP
Yii2框架实现登陆添加验证码功能示例
Jul 12 PHP
php常用字符串查找函数strstr()与strpos()实例分析
Jun 21 PHP
PHP Swoole异步Redis客户端实现方法示例
Oct 24 PHP
Mac M1安装mnmp (Mac+Nginx+MySQL+PHP) 开发环境
Mar 29 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读取纯真ip数据库使用示例
2014/01/26 PHP
浅谈PHP表单提交(POST&amp;GET&amp;URL编/解码)
2017/04/03 PHP
Yii2框架类自动加载机制实例分析
2018/05/02 PHP
URI、URL和URN之间的区别与联系
2006/12/20 Javascript
基于Jquery与WebMethod投票功能实现代码
2011/01/19 Javascript
jquery利用event.which方法获取键盘输入值的代码
2011/10/09 Javascript
Js注册协议倒计时的小例子
2013/06/24 Javascript
快速查找数组中的某个元素并返回下标示例
2013/09/03 Javascript
JS与C#编码解码
2013/12/03 Javascript
Iframe 自动适应页面的高度示例代码
2014/02/26 Javascript
Js 正则表达式知识汇总
2014/12/02 Javascript
javascript单页面手势滑屏切换原理详解
2016/03/21 Javascript
jQuery获取attr()与prop()属性值的方法及区别介绍
2016/07/06 Javascript
angularJS 如何读写缓冲的方法(推荐)
2016/08/06 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
2016/08/28 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
2016/10/04 Javascript
微信小程序获取手机网络状态的方法【附源码下载】
2017/12/08 Javascript
Vue仿Bibibili首页的问题
2021/01/21 Vue.js
详解微信小程序(Taro)手动埋点和自动埋点的实现
2021/03/02 Javascript
[04:23]DOTA2上海特锦赛小组赛第一日 TOP10精彩集锦
2016/02/27 DOTA
[40:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs TNC
2018/04/01 DOTA
[01:00:30]TFT vs VGJ.T Supermajor 败者组 BO3 第一场 6.5
2018/06/06 DOTA
[01:14]2019完美世界城市挑战赛(秋季赛)全国总决赛精彩花絮
2020/01/08 DOTA
Python实现的矩阵类实例
2017/08/22 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
2019/05/16 Python
django框架自定义模板标签(template tag)操作示例
2019/06/24 Python
python 字符串常用函数详解
2019/09/11 Python
jupyter notebook更换皮肤主题的实现
2021/01/07 Python
Python从MySQL数据库中面抽取试题,生成试卷
2021/01/14 Python
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
医学生个人求职信范文
2013/09/24 职场文书
财务管理专业自荐书
2014/09/02 职场文书
医生个人年度总结
2015/02/28 职场文书
《曾国藩家书》读后感——读家书,立家风
2019/08/21 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书
HAM-2000摩机图
2021/04/22 无线电