浅谈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 相关文章推荐
PHP5.2下chunk_split()函数整数溢出漏洞 分析
Jun 06 PHP
PHP源码之 ext/mysql扩展部分
Jul 17 PHP
php下获取客户端ip地址的函数
Mar 15 PHP
php 伪造本地文件包含漏洞的代码
Nov 03 PHP
php4与php5的区别小结(配置异同)
Dec 20 PHP
php模仿asp Application对象在线人数统计实现方法
Jan 04 PHP
php实现格式化多行文本为Js可用格式
Apr 15 PHP
浅谈php处理后端&amp;接口访问超时的解决方法
Oct 29 PHP
PHP实现的Redis多库选择功能单例类
Jul 27 PHP
php使用 readfile() 函数设置文件大小大小的方法
Aug 11 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
Sep 04 PHP
php中数组最简单的使用方法
Dec 27 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 分页原理详解
2009/08/21 PHP
php 数学运算验证码实现代码
2009/10/11 PHP
ubuntu12.04使用c编写php扩展模块教程分享
2013/12/25 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
基于jquery的气泡提示效果
2010/05/31 Javascript
IE下使用cloneNode注意事项分享
2012/11/22 Javascript
js用正则表达式来验证表单(比较齐全的资源)
2013/11/17 Javascript
深入剖析JavaScript中的枚举功能
2014/03/06 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
JavaScript中的small()方法使用详解
2015/06/08 Javascript
Vue 组件间的样式冲突污染
2017/08/31 Javascript
HTML5开发Kinect体感游戏的实例应用
2017/09/18 Javascript
vue-cli之router基本使用方法详解
2017/10/17 Javascript
详解node child_process模块学习笔记
2018/01/24 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
小程序实现带年月选取效果的日历
2018/06/27 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
Vue 实现前端权限控制的示例代码
2019/07/09 Javascript
利用Python爬取微博数据生成词云图片实例代码
2017/08/31 Python
Python实现基本数据结构中栈的操作示例
2017/12/04 Python
python多进程提取处理大量文本的关键词方法
2018/06/05 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
django实现将修改好的新模型写入数据库
2020/03/31 Python
Python 里最强的地图绘制神器
2021/03/01 Python
澳大利亚网上玩具商店:Mr Toys Toyworld
2018/03/25 全球购物
计算机软件个人的自荐信范文
2013/12/01 职场文书
军训自我鉴定
2013/12/14 职场文书
养殖行业的创业计划书
2014/01/05 职场文书
给儿子的表扬信
2014/01/15 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
副总经理党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/06 职场文书
河童之夏观后感
2015/06/11 职场文书
用React Native制作一个简单的游戏引擎
2021/05/27 Javascript
redis的list数据类型相关命令介绍及使用
2022/01/18 Redis