浅谈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下通过POST还是GET来传值
Jun 05 PHP
PHP XML error parsing SOAP payload on line 1
Jun 17 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
Jun 21 PHP
对于PHP 5.4 你必须要知道的
Aug 07 PHP
那些年我们错过的魔术方法(Magic Methods)
Jan 14 PHP
利用谷歌 Translate API制作自己的翻译脚本
Jun 04 PHP
php准确计算复活节日期的方法
Apr 18 PHP
以文件形式缓存php变量的方法
Jun 26 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
Nov 05 PHP
是 WordPress 让 PHP 更流行了 而不是框架
Feb 03 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
Oct 17 PHP
PHP的HTTP客户端Guzzle简单使用方法分析
Oct 30 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
Laravel如何友好的修改.env配置文件详解
2017/06/07 PHP
农历与西历对照
2006/09/06 Javascript
用ASP将SQL搜索出来的内容导出为TXT的代码
2007/07/27 Javascript
extjs tabpanel限制选项卡数量实现思路及代码
2013/04/02 Javascript
javascript 实现键盘上下左右功能的小例子
2013/09/15 Javascript
JS实现字体选色板实例代码
2013/11/20 Javascript
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
JavaScript中的DSL元编程介绍
2015/03/15 Javascript
jQuery判断邮箱格式对错实例代码讲解
2017/04/12 jQuery
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
微信小程序实现tab和swiper切换结合效果
2020/07/17 Javascript
详解vue 数据传递的方法
2018/04/19 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
2018/05/24 jQuery
发布一款npm包帮助理解npm的使用
2019/01/03 Javascript
使用taro开发微信小程序遇到的坑总结
2019/04/08 Javascript
js布局实现单选按钮控件
2020/01/17 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
Python实现单词拼写检查
2015/04/25 Python
在Python中使用poplib模块收取邮件的教程
2015/04/29 Python
Django REST Framework之频率限制的使用
2019/09/29 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
详解CSS3+JS完美实现放大镜模式
2020/12/03 HTML / CSS
美国网上眼镜商城:Zenni Optical
2016/11/20 全球购物
银河香水:Galaxy Perfume
2019/03/25 全球购物
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
俄罗斯首家面向中国消费者的一站式购物网站:Wruru
2020/05/08 全球购物
总务岗位职责
2013/11/19 职场文书
幼儿园毕业寄语
2014/04/03 职场文书
分公司经理任命书
2014/06/05 职场文书
党员四风自我剖析材料思想汇报
2014/09/13 职场文书
人事行政主管岗位职责
2015/04/09 职场文书
2015中秋祝酒词
2015/08/12 职场文书
红灯733-1型14管5波段半导体收音机
2021/04/22 无线电
常用的MongoDB查询语句的示例代码
2021/07/25 MongoDB