浅谈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调用三种数据库的方法(3)
Oct 09 PHP
?算你??的 PHP 程式大小
Dec 06 PHP
PHP数组内存耗用太多问题的解决方法
Apr 05 PHP
IP攻击升级,程序改进以对付新的攻击
Nov 23 PHP
Trying to clone an uncloneable object of class Imagic的解决方法
Jan 11 PHP
关于二级目录拖拽排序的实现(源码示例下载)
Apr 26 PHP
解析Win7 XAMPP apache无法启动的问题
Jun 26 PHP
PHP实现QQ登录实例代码
Jan 14 PHP
php自定义函数转换html标签示例
Sep 29 PHP
详谈PHP面向对象中常用的关键字和魔术方法
Feb 04 PHP
PHP面向对象之工作单元(实例讲解)
Jun 26 PHP
ThinkPHP5+Layui实现图片上传加预览功能
Aug 17 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之PHP语法学习笔记1
2006/12/17 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
2011/05/29 PHP
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
destoon首页调用求购供应信息的地区名称的方法
2014/08/21 PHP
PHP中子类重载父类的方法【parent::方法名】
2016/05/06 PHP
php使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
thinkPHP框架实现类似java过滤器的简单方法示例
2018/09/05 PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
2020/10/30 PHP
js中的window.open返回object的错误的解决方法
2009/08/15 Javascript
不要在cookie中使用特殊字符的原因分析
2010/07/13 Javascript
jQuery Select(单选) 模拟插件 V1.3.62 改进版
2010/07/17 Javascript
基于JQuery的模拟苹果桌面Dock效果(稳定版)
2012/10/15 Javascript
AngularJS入门之动画
2016/07/27 Javascript
Node.js 实现简单的接口服务器的实例代码
2017/05/23 Javascript
JS正则表达式完美实现身份证校验功能
2017/10/18 Javascript
手动用webpack搭建第一个ReactApp的示例
2018/04/11 Javascript
最后说说Vue2 SSR 的 Cookies 问题
2018/05/25 Javascript
javascript面向对象三大特征之封装实例详解
2019/07/24 Javascript
layui实现数据分页功能
2019/07/27 Javascript
[41:08]TNC vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
Python中处理时间的几种方法小结
2015/04/09 Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
2017/03/20 Python
Python2.7读取PDF文件的方法示例
2017/07/13 Python
Python2与Python3的区别实例总结
2019/04/17 Python
如何利用Python开发一个简单的猜数字游戏
2019/09/22 Python
Skyscanner波兰:廉价航班
2017/11/07 全球购物
经济信息管理专业大学生求职信
2013/09/27 职场文书
主持人演讲稿范文
2013/12/28 职场文书
人事文员岗位职责
2014/02/16 职场文书
目标责任书范本
2014/04/16 职场文书
地方白酒代理协议书
2014/10/25 职场文书
2016年春季运动会通讯稿
2015/11/25 职场文书
vue中data改变后让视图同步更新的方法
2021/03/29 Vue.js
MYSQL 的10大经典优化案例场景实战
2021/09/14 MySQL
MySQL一劳永逸永久支持输入中文的方法实例
2022/08/05 MySQL