浅谈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中函数内引用全局变量的方法
Oct 20 PHP
php 变量定义方法
Jun 14 PHP
PHP 时间日期操作实战
Aug 26 PHP
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
Jun 03 PHP
ThinkPHP自动完成中使用函数与回调方法实例
Nov 29 PHP
php定义一个参数带有默认值的函数实例分析
Mar 16 PHP
YII框架批量插入数据的方法
Mar 18 PHP
php二维码生成以及下载实现
Sep 28 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
Sep 30 PHP
Laravel 集成微信用户登录和绑定的实现
Dec 27 PHP
PHP程序员必须知道的两种日志实例分析
May 14 PHP
PHP生成随机密码4种方法及性能对比
Dec 11 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/07/12 PHP
php 什么是PEAR?
2009/03/19 PHP
ajax完美实现两个网页 分页功能的实例代码
2013/04/16 PHP
解析php取整的几种方式
2013/06/25 PHP
PHP curl使用实例
2015/07/02 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
2015/10/21 PHP
PHP实现linux命令tail -f
2016/02/22 PHP
超强多功能php绿色集成环境详解
2017/01/25 PHP
jQuery EasyUI API 中文文档 - Tabs标签页/选项卡
2011/10/01 Javascript
jQuery EasyUI API 中文文档 - PropertyGrid属性表格
2011/11/18 Javascript
JavaScript设置body高度为浏览器高度的方法
2015/02/09 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
2015/03/01 Javascript
javascript设计模式Constructor(构造器)模式
2016/08/19 Javascript
Javascript中prototype与__proto__的关系详解
2018/03/11 Javascript
Javascript执行流程细节原理解析
2020/05/14 Javascript
js实现滚动条自动滚动
2020/12/13 Javascript
python3使用urllib模块制作网络爬虫
2016/04/08 Python
Python 中pandas.read_excel详细介绍
2017/06/23 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
2018/01/24 Python
python 实现在Excel末尾增加新行
2018/05/02 Python
python语言基本语句用法总结
2019/06/11 Python
python基于gevent实现并发下载器代码实例
2019/11/01 Python
关于初始种子自动选取的区域生长实例(python+opencv)
2020/01/16 Python
Python命名空间namespace及作用域原理解析
2020/06/05 Python
记录模型训练时loss值的变化情况
2020/06/16 Python
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
2019/01/23 HTML / CSS
互动出版网:专业书籍
2017/03/21 全球购物
西式结婚主持词
2014/03/14 职场文书
在宿舍喝酒的检讨书
2014/09/28 职场文书
2015年少先队活动总结
2015/03/25 职场文书
2015初中政教处工作总结
2015/07/21 职场文书
高三数学教学反思
2016/02/18 职场文书
古诗之感恩老师
2019/10/24 职场文书
关于html选择框创建占位符的问题
2021/06/09 HTML / CSS
Python Matplotlib绘制两个Y轴图像
2022/04/13 Python