浅谈PHP中关于foreach使用引用变量的坑
写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);
输出结果
一开始看到第二个 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使用引用变量的坑全部内容了,希望大家多多支持脚本之家~
相关文章
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
这篇文章主要介绍了Zend Framework入门之环境配置及第一个Hello World示例,详细讲述了Zend Framework环境搭建与配置,以及实现第一个Hello World程序的方法,并附带demo源码供读者下载参考,需要的朋友可以参考下2016-03-03Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
这篇文章主要介绍了Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作,结合实例形式分析了thinkPHP控制器向视图传值及从视图取值相关操作技巧,需要的朋友可以参考下2019-10-10tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
这篇文章主要介绍了tp5.0框架隐藏index.php入口文件及模块和控制器的方法,结合实例形式分析thinkPHP5.0隐藏index.php入口文件及模块和控制器的具体配置方法、操作技巧与相关注意事项,需要的朋友可以参考下2020-02-02
最新评论