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查询域名状态whois的类
Nov 25 PHP
JS实现php的伪分页
May 25 PHP
php强制下载类型的实现代码
Apr 21 PHP
php之curl设置超时实例
Nov 03 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
Jan 07 PHP
Laravel 5 学习笔记
Mar 06 PHP
PHP登录(ajax提交数据和后台校验)实例分享
Dec 29 PHP
php curl常用的5个经典例子
Jan 20 PHP
PHP进程通信基础之信号
Feb 19 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
Mar 08 PHP
laravel返回统一格式错误码问题
Nov 04 PHP
php字符串倒叙
Apr 01 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学习笔记 类的声明与对象实例化
2011/06/13 PHP
js的event详解。
2006/09/06 Javascript
鼠标焦点离开文本框时验证的js代码
2013/07/19 Javascript
jQuery动态添加删除select项(实现代码)
2013/09/03 Javascript
浅析jQuery操作select控件的取值和设值
2016/12/07 Javascript
js禁止Backspace键使浏览器后退的实现方法
2017/09/01 Javascript
React/Redux应用使用Async/Await的方法
2017/11/16 Javascript
Mac下安装vue
2018/04/11 Javascript
npm 常用命令详解(小结)
2019/01/17 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
Vue循环中多个input绑定指定v-model实例
2020/08/31 Javascript
在js文件中引入(调用)另一个js文件的三种方法
2020/09/11 Javascript
浅谈vant组件Picker 选择器选单选问题
2020/11/04 Javascript
layui使用及简单的三级联动实现教程
2020/12/01 Javascript
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
Python生成pdf文件的方法
2014/08/04 Python
编写简单的Python程序来判断文本的语种
2015/04/07 Python
python使用wxPython打开并播放wav文件的方法
2015/04/24 Python
Python2.x版本中cmp()方法的使用教程
2015/05/14 Python
详解python中Numpy的属性与创建矩阵
2018/09/10 Python
使用Python-OpenCV消除图像中孤立的小区域操作
2020/07/05 Python
JACK & JONES瑞典官方网站:杰克琼斯欧式风格男装
2017/12/23 全球购物
荷兰网上药店:Drogisterij.net
2019/09/03 全球购物
Stio官网:男女、儿童户外服装
2019/12/13 全球购物
Kipling澳洲官网:购买凯浦林包包
2020/12/17 全球购物
机械设计制造专业个人求职信
2013/09/25 职场文书
专科应届生求职信
2013/11/24 职场文书
初中同学聚会感言
2014/02/11 职场文书
年级组长自我鉴定
2014/02/22 职场文书
爱之链教学反思
2014/04/30 职场文书
七夕情人节促销方案
2014/06/07 职场文书
基层党员群众路线教育实践活动个人对照检查材料思想汇报
2014/10/05 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
HTML通过表单实现酒店筛选功能
2021/05/18 HTML / CSS
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python