PHP关于foreach使用引用变量的坑
来源:互联网 发布:淘宝霸气收货人名字 编辑:程序博客网 时间:2024/04/28 04:23
写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]
解决办法:
- 尽量不使用相同的循环变量名;
- 每次使用完或再次使用前进行 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);
输出结果:
现在就正常了,这些小细节一定要注意了
0 0
- PHP关于foreach使用引用变量的坑
- PHP foreach使用 &引用 的坑
- php foreach循环关于&引用的问题
- PHP foreach变量的坑
- PHP---引用使用foreach(xxx as &$x)时候的坑。
- 关于PHP的变量引用
- 【PHP】 foreach循环中变量引用的一道面试题
- 关于php的foreach
- php关于变量的引用机制
- php关于变量的引用机制
- 【php】foreach中使用引用引起的问题
- 转-PHP —— 为什么不要在 FOREACH 中使用变量引用
- foreach之引用&的使用
- 说说PHP中foreach引用的一个坑
- 关于foreach的使用
- PHP:关于MYSQL双引号中引用PHP变量的问题
- PHP的引用变量
- PHP的引用和foreach循环
- ali生成签名工具类
- 【HeadFirst设计模式】1.策略模式
- python数字图像处理(7):图像的形变与缩放
- Maven常用命令
- ServletJsp之自定义标签
- PHP关于foreach使用引用变量的坑
- 常用工具类的介绍
- Spark源码解读(5)——存储子系统
- Java的this关键字使用(无笔记、待复习)
- 利用shell删除数据表中指定信息和字段对应的文件
- ServletFileUpload上传文件带进度条
- 注释符号的归纳>_<不想再入坑呀
- 关于大型网站架构的两本经典书籍
- python数字图像处理(8):对比度与亮度调整