浅谈PHP中关于foreach使用引用变量的坑


Posted in PHP onNovember 14, 2016

写PHP好多年,但仍然会犯低级错误,今天遇到个 foreach中引用变量时的坑,PHP版本为 5.6.12 代码如下:

<?php
$arr = ['a', 'b', 'c', 'd', 'e'];
foreach ($arr as $i=>&$a) {
  $a = $a.'_'. $a;
  echo $a .'<br>';
}
echo '<hr>';
foreach ($arr as $i=>$a) {
  echo $a .'<br>';
}
echo '<hr>';
print_r($arr);

输出结果

浅谈PHP中关于foreach使用引用变量的坑

一开始看到第二个 foreach 输出的结果感觉很是莫名其妙,怎么会输出两个 d_d 呢?

仔细想了想,原来因为PHP foreach 中的 $a 的作用域是整个函数的局部变量,在循环外部仍然有效,而不是被封闭在循环内的,

所以当执行第二个foreach 时的 $a 并不是新的变量,而是仍然指向 $arr 数组第5个元素的地址引用,

当第二个 foreach 在循环时实际上是在不停的给 $arr 数组的第5个元素赋值,

具体赋值情况,

第一次:a_a 赋值给第5个元素, 结果为: [a_a, b_b, c_c, d_d,a_a]

第二次:b_b 赋值给第5个元素,结果为: [a_a, b_b, c_c, d_d,b_b]

第三次:c_c 赋值给第5个元素,结果为: [a_a, b_b, c_c, d_d,c_c]

第四次:d_d 赋值给第5个元素,结果为: [a_a, b_b, c_c, d_d,d_d]

第五次:此时因为第五个元素已经变成 d_d 又重新把 d_d 赋值给第5个元素,结果还是为: [a_a, b_b, c_c, d_d,d_d]

解决办法:

1.尽量不使用相同的循环变量名;

2.每次使用完或再次使用前进行 unset($a); 处理,解除地址应用

还是用上面代码示例:

$arr = ['a', 'b', 'c', 'd', 'e'];
foreach ($arr as $i=>&$a) {
  $a = $a.'_'. $a;
  echo $a .'<br>';
}
echo '<hr>';
echo $a;
echo '<hr>';

// 这里 unset 掉
unset($a);

echo $a = 'ccc';
echo '<hr>';
print_r($arr);
echo '<hr>';
foreach ($arr as $i=>$a) {
  echo $a .'<br>';
}
echo '<hr>';
print_r($arr);

输出结果:

浅谈PHP中关于foreach使用引用变量的坑

现在就正常了,这些小细节一定要注意了

以上就是小编为大家带来的浅谈PHP中关于foreach使用引用变量的坑全部内容了,希望大家多多支持三水点靠木~

PHP 相关文章推荐
一个PHP+MSSQL分页的例子
Oct 09 PHP
浅析关于PHP位运算的简单权限设计
Jun 30 PHP
php的XML文件解释类应用实例
Sep 22 PHP
PHP生成压缩文件实例
Feb 07 PHP
php简单实现快速排序的方法
Apr 04 PHP
php基于Snoopy解析网页html的方法
Jul 09 PHP
10款实用的PHP开源工具
Oct 23 PHP
利用PHP抓取百度阅读的方法示例
Dec 18 PHP
yii2简单使用less代替css示例
Mar 10 PHP
PHP单例模式与工厂模式详解
Aug 29 PHP
Ubuntu彻底删除PHP7.0的方法
Jul 27 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
Feb 15 PHP
利用switch语句进行多选一判断的实例代码
Nov 14 #PHP
PHP表单验证内容是否为空的实现代码
Nov 14 #PHP
PHP环境搭建(php+Apache+mysql)
Nov 14 #PHP
10个值得深思的PHP面试题
Nov 14 #PHP
PHP生成word文档的三种实现方式
Nov 14 #PHP
php版微信返回用户text输入的方法
Nov 14 #PHP
THinkPHP获取客户端IP与IP地址查询的方法
Nov 14 #PHP
You might like
《斗罗大陆》六翼天使武魂最强,为什么老千家不是上三宗?
2020/03/02 国漫
PHP几个实用自定义函数小结
2016/01/25 PHP
php readfile下载大文件失败的解决方法
2017/05/22 PHP
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
2013/01/29 Javascript
使用jquery动态加载js文件的方法
2014/12/24 Javascript
Node.js中child_process实现多进程
2015/02/03 Javascript
jQuery前端分页示例分享
2015/02/10 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
原生js和jQuery实现淡入淡出轮播效果
2015/12/25 Javascript
javascript的正则匹配方法学习
2016/02/24 Javascript
JQuery给select添加/删除节点的实现代码
2016/04/26 Javascript
模拟javascript中的sort排序(简单实例)
2016/08/17 Javascript
Html5 js实现手风琴效果
2020/04/17 Javascript
详谈JavaScript的闭包及应用
2017/01/17 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
2017/03/23 Javascript
JavaScript累加、迭代、穷举、递归等常用算法实例小结
2018/05/08 Javascript
vue-router权限控制(简单方式)
2018/10/29 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
vue实现pdf文档在线预览功能
2019/11/26 Javascript
详解React 条件渲染
2020/07/08 Javascript
python操作MongoDB基础知识
2013/11/01 Python
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
Python简单进程锁代码实例
2015/04/27 Python
Python脚本实现自动将数据库备份到 Dropbox
2017/02/06 Python
python用Pygal如何生成漂亮的SVG图像详解
2017/02/10 Python
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
澳大利亚排名第一的狂热牛仔品牌:ONETEASPOON
2018/11/20 全球购物
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
招聘专员岗位职责
2014/03/07 职场文书
学校课外活动总结
2014/05/08 职场文书
七夕活动策划方案
2014/08/16 职场文书
一年级数学上册复习计划
2015/01/17 职场文书
高三化学教学反思
2016/02/22 职场文书
利用python做数据拟合详情
2021/11/17 Python