PHP中使用foreach和引用导致程序BUG的问题介绍
$a = array(1, 2);
$b = array(11, 12);
foreach($a as &$r){
}
foreach($b as $r){
}
echo $a[1]; // 输出 12
两个的循环的本意可能是: 第一个循环需要在循环中修改元素的内容, 所以使用引用; 但第二个循环只是把 $r 当作一个临时变量. 可是, 为什么 $a[1] 的值发生了改变呢?
当对 $a 的迭代完成后, $r 是 $a[1] 的引用, 改变 $r 的值, 就是改变 $a[1]. 这时, 你可以会奇怪, 代码中并没有修改 $r, 也没有修改 $a[1] 呀?
其实, foreach 是操作的是数组的拷贝, 所以, 后一个迭代相当于:
代码如下:
for($i=0; $i<count($b); $i++){
$r = $b[$i]; // 修改了 $r! 相当于 $a[1] = $b[$i];
}
为了避免这种情况, 应该在第一个迭代之后, 执行
代码如下:
unset($r);
从当前环境中删除 $r 这个变量(引用变量).
即使不是前面的例子, 在第一个迭代之后, 仍然十分可能再执行类似的语句:
代码如下:
$r = 123;
循环变量一般是临时变量, 同一个变量名在代码不同的地方表示不同的东西, 但变量的作用域又存在于循环之外. 这就是这种作用域规则的坏处, 加上”变量不声明即使用”的坏外, 再加上变量无类型的坏处.
所以, 在 PHP 中使用引用变量, 应该在引用使用完之后, 应该 unset(). 所有变量在使用之前应该先 unset().
相关推荐
-
PHP中for与foreach的区别分析
注意: 除非数组是被引用,foreach 所操作的是指定数组的一个拷贝,而不是该数组本身.因此数组指针不会被 each() 结构改变,对返回的数组单元的修改也不会影响原数组. 1. 自php5起,foreach 还可能遍历对象的属性. 2. 自php5起,foreach 可以很容易地通过在 $value 之前加上 & 来修改数组的单元,此方法将以引用赋值而不是拷贝一个值. 复制代码 代码如下: <?php $arr = array(1, 2, 3, 4); foreach ($arr as
-
php中用foreach来操作数组的代码
foreach()有两种用法: 复制代码 代码如下: foreach(array_name as $value) { statement; } 这里的array_name是你要遍历的数组名,每次循环中,array_name数组的当前元素的值被赋给$value,并且数组内部的下标向下移一 步,也就是下次循环回得到下一个元素. 复制代码 代码如下: foreach(array_name as $key => $value) { statement; } 这里跟第一种方法的区别就是多了个$key,也就
-
探讨:php中在foreach中使用foreach ($arr as &$value) 这种类型的解释
自 PHP 5 起,可以很容易地通过在 $value 之前加上 & 来修改数组的元素.此方法将以引用赋值而不是拷贝一个值. 复制代码 代码如下: <?php$arr = array(1, 2, 3, 4);foreach ($arr as &$value) { $value = $value * 2;}// $arr is now array(2, 4, 6, 8)?> 此方法仅在被遍历的数组可以被引用时才可用(例如是个变量). 复制代码 代码如下: <?phpfo
-
PHP循环语句笔记(foreach,list)
一般foreach用的比较多 复制代码 代码如下: <?php $price=array('apple'=>10,'orange'=>20,'banner'=>30); foreach($price as $key=>$value) { echo $key.'=>'.$value.'<br>'; } echo '<br>'; ?> 还有个更高级和常见的方法 复制代码 代码如下: <?php $shuiguo=array('apple'
-
PHP foreach循环使用详解与实例代码
foreach基本语法如下: FOREACH ($array_variable as $value) { [code to execute] } or FOREACH ($array_variable as $key => $value) { [code to execute] } 在这两种情况下,多次[代码执行]将被处死是等于在$ array_variable数组元素的个数. 让我们来看一个例子.假设我们有下面的代码段: 复制代码 代码如下: $array1 = array(1,2,3,4,5
-
php循环语句 for()与foreach()用法区别介绍
for 循环是 PHP 中最复杂的循环结构.它的行为和 C 语言的相似. for 循环的语法是: for (expr1; expr2; expr3) statement 第一个表达式(expr1)在循环开始前无条件求值一次. expr2 在每次循环开始前求值.如果值为 TRUE,则继续循环,执行嵌套的循环语句.如果值为 FALSE,则终止循环. expr3 在每次循环之后被求值(执行). 每个表达式都可以为空.expr2 为空意味着将无限循环下去(和 C 一样,PHP 认为其值为 TRUE).这
-
php foreach循环中使用引用的问题
看代码,再做解释 复制代码 代码如下: <?php $array=array('a','b','c','d'); foreach($array as $key=>$val){ //do something } echo $val;//输出d echo $kay;//输出3 $val='e'; print_r($array);//输出Array ( [0] => a [1] => b [2] => c [3] => d ) ?> 在foreach循环中,当循
-
PHP中foreach循环中使用引用要注意的地方
复制代码 代码如下: foreach ($array as &$row) { $row = explode('/', $row); } foreach ($array as $row) { //do something } 这么写,在第二个循环会出逻辑错误,加入第二个循环中do something的地方是输出$row,循环到最后一个的时候的输出是倒数第二个元素,而不是最后一个 要这么写 复制代码 代码如下: foreach ($array as &$row) { $row = explod
-
php foreach 参数强制类型转换的问题
所以,为了防止这样的信息出现,我使用foreach的时候,都会把参数进行强制类型转换,形势如下: foreach((array)$arr as $key => $value); 这样做一直相安无事,就在前几天,突然出现了问题.我强制类型转换以后不能正常的调用object的方法了. 复制代码 代码如下: <?php class service implements Iterator{ function __construct($service_define,$filter=null){ $thi
-
php中如何使对象可以像数组一样进行foreach循环
刚接触到题的时候,我也没有考虑到Iterator模式,试了几个一般想法,失败以后....就直接去翻看了foreach的源码实现,期望发现foreach处理对象的时候是否有什么特殊性,可以做为突破口. 跟踪了半天以后发现了核心逻辑中的一个奇怪的switch: 复制代码 代码如下: switch (zend_iterator_unwrap(array, &iter TSRMLS_CC)) { default: case ZEND_ITER_INVALID:
-
深入解析php中的foreach问题
前言:php4中引入了foreach结构,这是一种遍历数组的简单方式.相比传统的for循环,foreach能够更加便捷的获取键值对.在php5之前,foreach仅能用于数组:php5之后,利用foreach还能遍历对象(详见:遍历对象).本文中仅讨论遍历数组的情况. foreach虽然简单,不过它可能会出现一些意外的行为,特别是代码涉及引用的情况下.下面列举了几种case,有助于我们进一步认清foreach的本质.问题1: 复制代码 代码如下: $arr = array(1,2,3);fore
-
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
复制代码 代码如下: $id = intval($_GET['id']); $row = $db->getResult($db->query("select * from ".$t."product where id=$id;")); $rows = $row[0];//处理mysql_fetch_assoc返回来的数组 不用foreach----echo!
-
深入解析php中的foreach函数
Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式.foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息. 有两种语法: 复制代码 代码如下: foreach (array_expression as $value) statementforeach (array_expression as $key => $value) statement 例子1: 复制代码 代码如下: <?php$a
-
PHP中的函数-- foreach()的用法详解
PHP 4 引入了 foreach 结构,和 Perl 以及其他语言很像.这只是一种遍历数组简便方法.foreach 仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误.有两种语法,第二种比较次要但却是第一种的有用的扩展. 复制代码 代码如下: foreach (array_expression as $value) statementforeach (array_expression as $key => $value) statement 第一种格式遍历给
随机推荐
- JavaScript基于DOM操作实现简单的数学运算功能示例
- 什么是AGAS涂层和AGAS涂层的好处
- java中final修饰符的使用方法
- iOS开发 正则运算详细介绍
- Python获取邮件地址的方法
- C#难点逐个击破(6):C#数据类型与.net framework数据类型
- asp.net字符串处理类代码
- Pear DB 新手入门指南教程第1/3页
- 基于C#中IDisposable与IEnumerable、IEnumerator的应用
- JavaScript随机生成颜色的方法
- Python的ORM框架SQLObject入门实例
- 用户体验第一 font-size放弃px选择em
- Ajax与mysql数据交互制作留言板功能(全)
- C#转换日期类型实例
- 检查并修复mysql数据库表的具体方法
- IIS6、IIS7、IIS7.5取消服务器主机空间目录脚本的执行权限的方法
- jQuery中(function(){})()执行顺序的理解
- LNMP系列教程之二 删除站点及域名绑定
- 配置apache支持apk ipk下载的方法
- C#通过IComparable实现ListT.sort()排序