浅谈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 相关文章推荐
apache+mysql+php+ssl服务器之完全安装攻略
Sep 05 PHP
探讨:php中在foreach中使用foreach ($arr as &amp;$value) 这种类型的解释
Jun 24 PHP
PHP empty函数报错解决办法
Mar 06 PHP
模板引擎smarty工作原理以及使用示例
May 25 PHP
PHP实现下载断点续传的方法
Nov 12 PHP
php判断类是否存在函数class_exists用法分析
Nov 14 PHP
微信自定义分享php代码分析
Nov 24 PHP
PHP fprintf()函数用法讲解
Feb 16 PHP
PHP里的$_GET数组介绍
Mar 22 PHP
PHP下用Swoole实现Actor并发模型的方法
Jun 12 PHP
laravel 解决后端无法获取到前端Post过来的值问题
Oct 22 PHP
php7中停止php-fpm服务的方法详解
May 09 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使用sql server验证连接数据库的方法
2014/12/25 PHP
PHP操作mysql数据库分表的方法
2016/06/09 PHP
PHP实现根据密码长度显示安全条
2017/07/04 PHP
Nigma vs Liquid BO3 第二场2.14
2021/03/10 DOTA
经常用的图片在容器中的水平垂直居中实例
2007/06/10 Javascript
使用jQuery的ajax功能实现的RSS Reader 代码
2009/09/03 Javascript
用document.documentElement取代document.body的原因分析
2009/11/12 Javascript
jquery实现动态画圆
2014/12/04 Javascript
Javascript中Date类型和Math类型详解
2016/02/27 Javascript
JavaScript必知必会(五) eval 的使用
2016/06/08 Javascript
jquery精度计算代码 jquery指定精确小数位
2017/02/06 Javascript
JS实现快速比较两个字符串中包含有相同数字的方法
2017/09/11 Javascript
深入浅析Vue中的Prop
2018/06/10 Javascript
jQuery实现简单复制json对象和json对象集合操作示例
2018/07/09 jQuery
[56:18]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第二局
2016/03/05 DOTA
Python常用正则表达式符号浅析
2014/08/13 Python
简单介绍Python中用于求最小值的min()方法
2015/05/15 Python
Python2.7读取PDF文件的方法示例
2017/07/13 Python
R语言 vs Python对比:数据分析哪家强?
2017/11/17 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
Python 利用高德地图api实现经纬度与地址的批量转换
2019/08/14 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
Selenium关闭INFO:CONSOLE提示的解决
2020/12/07 Python
美国花布包包品牌:Vera Bradley
2017/08/11 全球购物
美国领先的个性化礼品商城:Personalization Mall
2019/07/27 全球购物
自然健康的概念:Natural Healthy Concepts
2020/01/26 全球购物
自我鉴定怎么写
2014/01/12 职场文书
无故旷工检讨书
2014/01/26 职场文书
采购经理岗位职责
2014/02/16 职场文书
战略合作意向书范本
2014/04/01 职场文书
平安家庭示范户事迹
2014/06/02 职场文书
绿色校园广播稿
2014/10/13 职场文书
2014年敬老院工作总结
2014/12/08 职场文书
2015年工商所工作总结
2015/05/21 职场文书
《三国志》赏析
2019/08/27 职场文书
html中显示特殊符号(附带特殊字符对应表)
2021/06/21 HTML / CSS