浅谈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 相关文章推荐
phpmyadmin MySQL 加密配置方法
Jul 05 PHP
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
Jun 13 PHP
php实现的九九乘法口诀表简洁版
Jul 28 PHP
PHP中创建图像并绘制文字的例子
Nov 19 PHP
ThinkPHP中Session用法详解
Nov 29 PHP
PHP实现事件机制实例分析
Jun 26 PHP
PHP超全局数组(Superglobals)介绍
Jul 01 PHP
php 指定范围内多个随机数代码实例
Jul 18 PHP
利用PHP绘图函数实现简单验证码功能的方法
Oct 18 PHP
PHP检测数据类型的几种方法(总结)
Mar 04 PHP
PHP利用二叉堆实现TopK-算法的方法详解
Apr 24 PHP
PHP赋值的内部是如何跑的详解
Jan 13 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
PHP中创建并处理图象
2006/10/09 PHP
动易数据转成dedecms的php程序
2007/04/07 PHP
PHP高级OOP技术演示
2009/08/27 PHP
php+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
Yii控制器中操作视图js的方法
2016/07/04 PHP
thinkphp利用模型通用数据编辑添加和删除的实例代码
2016/11/20 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
2019/12/13 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
dojo 之基础篇(二)之从服务器读取数据
2007/03/24 Javascript
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例(直接运行实例)
2013/07/09 Javascript
js给onclick赋值传参数的两种方法
2013/11/25 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
JavaScript获取网页表单提交方式的方法
2015/04/02 Javascript
JavaScript实现select添加option
2015/07/03 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
2016/05/12 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
2018/09/27 Javascript
浅谈vue项目4rs vue-router上线后history模式遇到的坑
2018/09/27 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
js实现随机div颜色位置 类似满天星效果
2019/10/24 Javascript
vue实现把接口单独存放在一个文件方式
2020/08/13 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
[02:27]2018DOTA2亚洲邀请赛赛前采访-OpTic
2018/04/03 DOTA
Python的一些用法分享
2012/10/07 Python
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
python文件写入实例分析
2015/04/08 Python
总结Python编程中函数的使用要点
2016/03/20 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
Python pip install如何修改默认下载路径
2020/04/29 Python
使用Html5 Stream开发实时监控系统
2020/06/02 HTML / CSS
百思买美国官网:Best Buy
2016/07/28 全球购物
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
年度考核自我鉴定
2014/02/02 职场文书
个人考核材料
2014/05/15 职场文书
2015年中学图书馆工作总结
2015/07/22 职场文书