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
使用淘宝IP库获取用户ip地理位置
Oct 27 PHP
php短址转换实现方法
Feb 25 PHP
php将12小时制转换成24小时制的方法
Mar 31 PHP
php获取系统变量方法小结
May 29 PHP
PHP模板解析类实例
Jul 09 PHP
PHP实现上传文件并存进数据库的方法
Jul 16 PHP
ThinkPHP框架表单验证操作方法
Jul 19 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 PHP
PHP实现简单登录界面
Oct 23 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 PHP
七种PHP开发环境搭建工具
Jun 28 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实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
2017/08/10 PHP
网站繁简切换的JS遇到页面卡死的解决方法
2014/03/12 Javascript
javascript中的return和闭包函数浅析
2014/06/06 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
javascript制作2048游戏
2015/03/30 Javascript
基于jQuery实现网页打印功能
2015/12/01 Javascript
学习使用AngularJS文件上传控件
2016/02/16 Javascript
JavaScript学习笔记之数组去重
2016/03/23 Javascript
基于javascript制作微博发布栏效果
2016/04/04 Javascript
jquery判断类型是不是number类型的实例代码
2016/10/07 Javascript
详解jQuery插件开发方式
2016/11/22 Javascript
bootstrap侧边栏圆点导航
2017/01/11 Javascript
微信小程序 跳转传参数与传对象详解及实例代码
2017/03/14 Javascript
微信小程序自定义音乐进度条的实例代码
2018/08/28 Javascript
angular2 组件之间通过service互相传递的实例
2018/09/30 Javascript
react脚手架如何配置less和ant按需加载的方法步骤
2018/11/28 Javascript
mapboxgl区划标签避让不遮盖实现的代码详解
2020/07/01 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
Hadoop中的Python框架的使用指南
2015/04/22 Python
Python使用爬虫猜密码
2016/02/19 Python
Python实现简单登录验证
2016/04/13 Python
开源Web应用框架Django图文教程
2017/03/09 Python
python中的随机函数小结
2018/01/27 Python
Python中的上下文管理器和with语句的使用
2018/04/17 Python
Python从使用线程到使用async/await的深入讲解
2018/09/16 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
MNIST数据集转化为二维图片的实现示例
2020/01/10 Python
python环境下安装opencv库的方法
2020/03/05 Python
如何解决cmd运行python提示不是内部命令
2020/07/01 Python
使用sublime text3搭建Python编辑环境的实现
2021/01/12 Python
非功能性需求都包括哪些方面
2013/10/29 面试题
员工工作表扬信范文
2014/01/13 职场文书
2015年酒店工作总结范文
2015/04/07 职场文书
校园音乐节目广播稿
2015/08/19 职场文书
详解MySQL多版本并发控制机制(MVCC)源码
2021/06/23 MySQL
拙作再改《我的收音机情缘》
2022/04/05 无线电