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中的字符串函数
Nov 24 PHP
一个比较简单的PHP 分页分组类
Dec 10 PHP
php 无限级数据JSON格式及JS解析
Jul 17 PHP
模板引擎正则表达式调试小技巧
Jul 20 PHP
遍历指定目录下的所有目录和文件的php代码
Nov 27 PHP
PHP获取客户端真实IP地址的5种情况分析和实现代码
Jul 08 PHP
用 Composer构建自己的 PHP 框架之构建路由
Oct 30 PHP
PHP实现的一致性哈希算法完整实例
Nov 14 PHP
PHP批量去除BOM头内容信息代码
Mar 11 PHP
PHP获取网页所有连接的方法(附demo源码下载)
Mar 30 PHP
PHP编程获取各个时间段具体时间的方法
May 26 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
Jun 02 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
为查询结果建立向后/向前按钮
2006/10/09 PHP
解析php开发中的中文编码问题
2013/08/08 PHP
ThinkPHP实现二级循环读取的方法
2014/11/03 PHP
PHP中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
PHP基于array_unique实现二维数组去重
2020/07/14 PHP
JavaScript 以对象为索引的关联数组
2010/05/19 Javascript
jquery仿京东导航/仿淘宝商城左侧分类导航下拉菜单效果
2013/04/24 Javascript
使用JavaScript获取地址栏参数的方法
2014/12/19 Javascript
js强制把网址设为默认首页
2015/09/29 Javascript
jQuery拖动布局其结果保存到数据库
2015/10/09 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
jQuery.uploadify文件上传组件实例讲解
2016/09/23 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
2017/09/20 Javascript
JavaScript 有用的代码片段和 trick
2018/02/22 Javascript
微信小程序实现跑马灯效果
2020/10/21 Javascript
JQuery Ajax跨域调用和非跨域调用问题实例分析
2019/04/16 jQuery
微信小程序select下拉框实现效果
2019/05/15 Javascript
vue集成chart.js的实现方法
2019/08/20 Javascript
JavaScript键盘事件响应顺序详解
2019/09/30 Javascript
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
python实现扫描日志关键字的示例
2018/04/28 Python
numpy ndarray 取出满足特定条件的某些行实例
2019/12/05 Python
python numpy--数组的组合和分割实例
2020/02/24 Python
python实现Pyecharts实现动态地图(Map、Geo)
2020/03/25 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
idea2020手动安装python插件的实现方法
2020/07/17 Python
Python 内存管理机制全面分析
2021/01/16 Python
详解canvas绘制多张图的排列顺序问题
2019/01/21 HTML / CSS
记一次高分屏下canvas模糊问题
2020/02/17 HTML / CSS
美国在线打印网站:Overnight Prints
2018/10/11 全球购物
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
应届生法律求职信
2013/10/22 职场文书
甜品店的创业计划书范文
2014/01/02 职场文书
住房公积金接收函
2014/01/09 职场文书
Python的property属性详细讲解
2022/04/11 Python