浅谈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在Web开发领域的优势
Oct 09 PHP
php 无限分类的树类代码
Dec 03 PHP
php缓冲 output_buffering的使用详解
Jun 13 PHP
浅析PHP中的UNICODE 编码与解码
Jun 29 PHP
微信公众平台接口开发入门示例
Dec 24 PHP
php上传大文件失败的原因及应对策略
Oct 20 PHP
PHP json_encode() 函数详解及中文乱码问题
Nov 05 PHP
PHP实现对xml的增删改查操作案例分析
May 19 PHP
解决form中action属性后面?传递参数 获取不到的问题
Jul 21 PHP
ThinkPHP防止重复提交表单的方法实例分析
May 10 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
Dec 06 PHP
yii2.0框架实现上传excel文件后导入到数据库的方法示例
Apr 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
discuz的php防止sql注入函数
2011/01/17 PHP
php生成zip文件类实例
2015/04/07 PHP
PHP 数组黑名单/白名单实例代码详解
2019/06/04 PHP
javascript Array数组对象的扩展函数代码
2010/05/22 Javascript
通过下拉框的值来确定输入框是否可以为空的代码
2011/10/18 Javascript
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
HTML中的setCapture和releaseCapture使用介绍
2012/03/21 Javascript
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
Js+Jq获取URL参数的集中方法示例代码
2014/05/20 Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
2014/11/04 Javascript
mvc中form表单提交的三种方式(推荐)
2016/08/10 Javascript
IntersectionObserver API 详解篇
2016/12/11 Javascript
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
JavaScript判断浏览器及其版本信息
2017/01/20 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
JS实现评价的星星功能
2017/08/20 Javascript
Node层模拟实现multipart表单的文件上传示例
2018/01/02 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
2018/12/05 Javascript
大转盘抽奖小程序版 转盘抽奖网页版
2020/04/16 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
nodeJs项目在阿里云的简单部署
2020/11/27 NodeJs
py2exe 编译ico图标的代码
2013/03/08 Python
CentOS中使用virtualenv搭建python3环境
2015/06/08 Python
Python中return语句用法实例分析
2015/08/04 Python
用Python写冒泡排序代码
2016/04/12 Python
python实现遍历文件夹修改文件后缀
2018/08/28 Python
python生成多个只含0,1元素的随机数组或列表的实例
2018/11/12 Python
pandas如何处理缺失值
2019/07/31 Python
Python OpenCV去除字母后面的杂线操作
2020/07/05 Python
前台文员的岗位职责
2013/11/14 职场文书
学校门卫管理制度
2014/01/30 职场文书
运动会广播稿150字
2014/02/19 职场文书
银行竞聘上岗演讲稿
2014/09/12 职场文书
辞职信范文大全
2015/03/02 职场文书
一篇带你入门Java垃圾回收器
2021/06/16 Java/Android