浅谈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 相关文章推荐
php4的session功能评述(一)
Oct 09 PHP
PHP XML备份Mysql数据库
May 27 PHP
PHP 编程安全性小结
Jan 08 PHP
php安全开发 添加随机字符串验证,防止伪造跨站请求
Feb 14 PHP
简单实用的.net DataTable导出Execl
Oct 28 PHP
php生成txt文件标题及内容的方法
Jan 16 PHP
PHP简单选择排序算法实例
Jan 26 PHP
php实现有趣的人品测试程序实例
Jun 08 PHP
Yii2汉字转拼音类的实例代码
Apr 18 PHP
yii2 commands模式以及配置crontab定时任务的方法
Aug 19 PHP
phpstudy的php版本自由修改的方法
Oct 18 PHP
php正确输出json数据的实例讲解
Aug 21 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中的extract的作用分析
2008/04/09 PHP
ThinkPHP模板中判断volist循环的最后一条记录的验证方法
2014/07/01 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
2016/01/08 PHP
PHP 序列化和反序列化函数实例详解
2020/07/18 PHP
jQuery插件-jRating评分插件源码分析及使用方法
2012/12/28 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
jQuery打印指定区域Html页面并自动分页
2014/07/04 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
2015/08/27 Javascript
BootStrap中关于Select下拉框选择触发事件及扩展
2016/11/22 Javascript
JS重载实现方法分析
2016/12/16 Javascript
React 组件中的 bind(this)示例代码
2018/09/16 Javascript
JavaScript从原型到原型链深入理解
2019/06/03 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
2019/07/02 Javascript
js定义类的方法示例【ES5与ES6】
2019/07/30 Javascript
解决layui-open关闭自身窗口的问题
2019/09/10 Javascript
微信小程序实现点击导航条切换页面
2020/11/19 Javascript
[02:56]DOTA2英雄基础教程 巨魔战将
2013/12/10 DOTA
[04:52]DOTA2亚洲邀请赛附加赛 TOP10精彩集锦
2015/01/29 DOTA
[02:14]2016国际邀请赛中国区预选赛Ehome晋级之路
2016/07/01 DOTA
[01:03]悬念揭晓 11月26日DOTA2完美盛典不见不散
2017/11/23 DOTA
Python中使用pprint函数进行格式化输出的教程
2015/04/07 Python
python中的lambda表达式用法详解
2016/06/22 Python
Python用zip函数同时遍历多个迭代器示例详解
2016/11/14 Python
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
Python3.5运算符操作实例详解
2019/04/25 Python
对Python _取log的几种方式小结
2019/07/25 Python
python 实现绘制整齐的表格
2019/11/18 Python
PyTorch中的Variable变量详解
2020/01/07 Python
TFRecord格式存储数据与队列读取实例
2020/01/21 Python
中国跨镜手机配件批发在线商店:TVC-Mall
2019/08/20 全球购物
Everlast官网:拳击、综合格斗和健身相关的体育用品
2020/08/03 全球购物
班级口号大全
2014/06/09 职场文书
工作目标责任书
2014/07/23 职场文书
2016年优秀团员事迹材料
2016/02/25 职场文书
SQL 聚合、分组和排序
2021/11/11 MySQL