浅谈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带密码功能并下载远程文件保存本地指定目录 修改加强版
May 16 PHP
php多文件上传功能实现原理及代码
Apr 18 PHP
30个php操作redis常用方法代码例子
Jul 05 PHP
PHP中require和include路径问题详解
Dec 25 PHP
PHP curl模拟登录带验证码的网站
Nov 30 PHP
yii用户注册表单验证实例
Dec 26 PHP
Yii中表单用法实例详解
Jan 05 PHP
thinkphp在低版本Nginx 下支持PATHINFO的方法分享
May 27 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
Nov 28 PHP
php获取网站根目录物理路径的几种方法(推荐)
Mar 04 PHP
laravel 实现根据字段不同值做不同查询
Oct 23 PHP
一文看懂PHP进程管理器php-fpm
Jun 01 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
UCenter Home二次开发指南
2009/05/28 PHP
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
php的mkdir()函数创建文件夹比较安全的权限设置方法
2014/07/28 PHP
PHP实现的购物车类实例
2015/06/17 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
2017/07/13 PHP
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
20个最新的jQuery插件
2012/01/13 Javascript
使用Java实现简单的server/client回显功能的方法介绍
2013/05/03 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
基于JavaScript代码实现微信扫一扫下载APP
2015/12/30 Javascript
JavaScript中三种异步上传文件方式
2016/03/06 Javascript
常用原生JS兼容性写法汇总
2016/04/27 Javascript
webpack 样式加载的实现原理
2018/06/12 Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
2021/01/30 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
微信小程序中遇到的iOS兼容性问题小结
2018/11/14 Javascript
node.js微信小程序配置消息推送的实现
2019/02/13 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
Vue中Table组件Select的勾选和取消勾选事件详解
2019/03/19 Javascript
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
python技能之数据导出excel的实例代码
2017/08/11 Python
Python实现识别手写数字 Python图片读入与处理
2020/03/23 Python
Python2中文处理纪要的实现方法
2018/03/10 Python
pybind11和numpy进行交互的方法
2019/07/04 Python
html5 datalist标签使用示例(自动完成组件)
2014/05/04 HTML / CSS
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
学生实习推荐信范文
2013/11/26 职场文书
税务会计岗位职责
2014/02/18 职场文书
大一新生学期自我评价
2014/04/09 职场文书
学生党员一帮一活动总结
2014/07/08 职场文书
技术入股合作协议书
2014/10/07 职场文书
大学生档案自我鉴定(2篇)
2014/10/14 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers
Django debug为True时,css加载失败的解决方案
2021/04/24 Python
mysql中整数数据类型tinyint详解
2021/12/06 MySQL