浅谈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 相关文章推荐
MySQL中create table语句的基本语法是
Jan 15 PHP
php simplexmlElement操作xml的命名空间实现代码
Jan 04 PHP
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
Jun 16 PHP
PHP中通过语义URL防止网站被攻击的方法分享
Sep 08 PHP
初品cakephp 入门基础
Feb 16 PHP
PHP 动态生成静态HTML页面示例代码
Jan 15 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
Nov 17 PHP
php 伪造ip以及url来路信息方法汇总
Nov 25 PHP
PHP实现二维数组根据key进行排序的方法
Dec 30 PHP
php 三大特点:封装,继承,多态
Feb 19 PHP
PHP实现统计所有字符在字符串中出现次数的方法
Oct 17 PHP
laravel validate 设置为中文的例子(验证提示为中文)
Sep 29 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
改造一台复古桌面收音机
2021/03/02 无线电
php下正则来匹配dede模板标签的代码
2010/08/21 PHP
PHP 图片文件上传实现代码
2010/12/29 PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
2014/06/29 PHP
PHP curl实现抓取302跳转后页面的示例
2014/07/04 PHP
PHP多线程之内部多线程实例分析
2015/03/09 PHP
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
用js查找法实现当前栏目的高亮显示的代码
2007/11/24 Javascript
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
javascript与CSS复习(二)
2010/06/29 Javascript
js特殊字符过滤的示例代码
2014/03/05 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
JavaScript图片轮播代码分享
2015/07/31 Javascript
原生js实现倒计时功能(多种格式调用)
2017/01/12 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
node.js连接MongoDB数据库的2种方法教程
2017/05/17 Javascript
JS 实现banner图片轮播效果(鼠标事件)
2017/08/04 Javascript
AngularJS 实现购物车全选反选功能
2017/10/24 Javascript
VUE.js实现动态设置输入框disabled属性
2019/10/28 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
2020/02/20 Javascript
[44:50]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 TNC vs VG
2018/04/02 DOTA
python生成tensorflow输入输出的图像格式的方法
2018/02/12 Python
基于numpy.random.randn()与rand()的区别详解
2018/04/17 Python
解决python3中的requests解析中文页面出现乱码问题
2019/04/19 Python
Python银行系统实战源码
2019/10/25 Python
python:批量统计xml中各类目标的数量案例
2020/03/10 Python
详解CSS3选择器的使用方法汇总
2015/11/24 HTML / CSS
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
土木工程个人自荐信范文
2013/11/30 职场文书
医药类个人求职的自我评价
2014/02/12 职场文书
签约仪式主持词
2014/03/19 职场文书
2014年公务员个人工作总结
2014/11/22 职场文书
2015年世界无烟日活动总结
2015/02/10 职场文书
导游词之南京中山陵
2019/11/27 职场文书
一文搞懂PHP中的抽象类和接口
2022/05/25 PHP