PHP中使用foreach引用需要注意的问题-阿里云开发者社区

开发者社区> 吞吞吐吐的> 正文

PHP中使用foreach引用需要注意的问题

简介:
+关注继续查看

本文目的

今天在写项目时,发现php foreach语句中使用引用会出现奇特现象,故此记录此现象,原因和解决方法。希望对其他人有帮助!

现象

猜猜下面的代码会输出什么?

1
2
3
4
5
6
7
8
<?php
$a = array(1=>'one', 2=>'two');
 
foreach ($a as $key => &$val) {} // do nothing
var_dump($a);
  
foreach ($a as $key => $val) {} // do nothing
var_dump($a);

如果没有遇到过类似的问题,肯定会对结果大惊!如下图

image001.jpg

我勒个去,怎么修改了数组,代码中没有任何显示修改数组的操作呀!

 

原因

在foreach中使用了引用,&$val,这个值并没有在第一个foreach退出后自动清空,而是保留在内容中,当进入第二个foreach时,仍然可以访问到$val。所以,在第二个foreach的第一次循环时,实际上已经修改了$a[1]的值。第二次循环时,值保持不变。

解决方案

第一次循环退出后,unset这个临时变量$val,如下代码所示:

1
2
3
4
5
6
7
8
9
<?php
$a = array(1=>'one', 2=>'two');
  
foreach ($a as $key => &$val) {} // do nothing
unset($val); // important!
var_dump($a);
 
foreach ($a as $key => $val) {} // do nothing
var_dump($a);

输出结果如下:

image002.jpg

 

参考资料

声明:如有转载本博文章,请注明出处。您的支持是我的动力!文章部分内容来自互联网,本人不负任何法律责任。
本文转自bourneli博客园博客,原文链接:http://www.cnblogs.com/bourneli/archive/2012/10/29/2745130.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
关于RCP引用jar包的几个问题。
先说明两个概念:类加载器,OSGI 类加载器(class loader),顾名思义就是JVM用于加载类的一个工具。当然,它本身也是一个java类,见java.lang.ClassLoader。它维护内部的类名空间,相互关系(域),并为它们隔绝外部侵害。
676 0
函数返回值是否使用引用类型的问题:理解引用、返回值
  在《对象更有用的玻璃罩——常引用》一文中,介绍了对象作为函数的参数时,推荐使用引用的形式。并且,如果实际参数的值不允许改变时,声明为常引用更佳。   在《第8周-任务1-方案3-复数类中运算符重载(与实数运算)》中,又讨论了一个问题,结论是:在类似复数加法运算符重载这样的函数,形式参数用作为常引用最佳,如: friend Complex operator + (const
1161 0
mono for android使用WCF编译问题
原来安装Mono For Android4.10的时候没问题。这次安装的是4.12.02001就有问题了。晕死。 无法解决“System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”与“System.ServiceModel, Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”之间的冲突。
594 0
【巡检问题分析与最佳实践】MongoDB 空间使用问题
阿里云数据库MongoDB的空间使用率是一个非常重要的监控指标,如果实例的存储空间完全打满,将会直接导致实例不可用。一般来说,当一个MongoDB实例的存储空间使用比例达到80-85%以上时,就应及时进行处理,要么降低数据库实际占用空间的大小,要么对存储空间进行扩容,以避免空间打满的风险。 然而,阿里云数据库MongoDB的空间使用情况分析并不简单,本文将由浅入深帮您查看,分析和优化云数据库MongoDB的空间使用。
243 0
Gradle中使用idea插件的一些实践
如果你的项目使用了Gradle作为构建工具,那么你一定要使用Gradle来自动生成IDE的项目文件,无需再手动的将源代码导入到你的IDE中去了。 如果你使用的是eclipse,可以在build.gradle中加入这么一行. 1 apply plugin: 'eclipse' 然后在命令行中输入gradle eclipse就可以生成eclipse的项目文件,直接使用eclipse打开生成的项目文件即可。
1235 0
视图层的引用和模板使用
引用: axml提供两种文件引用方式import和include。    (1)import import可以加载已经定义好的template。             比如,在item.axml中定义了一个叫item的template。
251 0
4852
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载