PHP数组foreach时使用&改变值问题
2016-09-09 10:26
363 查看
/* 2016.11.14更新 以下理解有误,关于PHP引用变量与指针是有区别,PHP的变量名与变量内容是不同的东西,引用变量相当于一个新的变量名指向 同一个变量内容 将下面图中的地址比如 0x.... 的地址替换为不同的变量名去理解才是OK的 人懒,不想重新画图。懂意思就好 */
遇到一个问题,对数组进行遍历的时候,如果使用引用变量&V操作值,如果不及时unset掉的话,后续可能会出现问题。
<?php $arr = [1,2,3,4,5]; foreach($arr as &$v){ echo "$v "; } echo '<br />'; // 第二次是$v 而不是 &$v foreach($arr as $v){ echo "$v "; } echo '<br />'; print_r($arr); ?>
运行结果如下图:
为什么第二次打印的是 1 2 3 4 4呢?
此处的$v是一个引用变量,每次foreach的时候,其实有两个过程,取值,再赋值。电脑通过内存地址取值,&的过程,就是将变量的内存地址赋值给变量。
图一
foreach的时候,因为是as &$v,所以会依次将数组中的每个值的地址给$v,如果用foreach($arr as $k => &$v)表示的话,可以理解为,$v = &$arr[$k]。每一次都是取地址,因此不会改变数组的值。当第一次数据遍历结束的时候,$v指向的时候数组arr的最后一个单元。
当第二次遍历的时候,还是按照foreach($arr as $k => $v)来画图,$k是arr的索引,而$v指向arr最后一个值的地址,这里是$arr[4],因为每次的过程大概为下图
第一次将arr[0]取出赋值给$v,同时因为$v指向arr[4]的地址,所以会用arr[0]的值覆盖arr[4]的值,往后同理
最后一次,因为arr[4]已经是4了,所以覆盖自身,仍然是4
因此 最后的结果 是1 2 3 4 4。如果将第二个foreach中的$v也换为&$v,那么就会重新改变$v的指向,这种情况下就重复图一的过程,而不会改变$arr的值
相关文章推荐
- php中用foreach改变数组的值的问题
- php中用foreach改变数组的值的问题
- php中的foreach改变数组的值的问题
- 约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
- 数组与类使用PHP的可变变量名需要的注意的问题
- PHP 使用list函数each函数遍历数组(实现foreach)解析
- php字符串当数组使用isset的问题
- PHP中使用foreach和引用导致程序BUG的问题介绍
- php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
- php 操作数组array_merge使用时数组包含数字键名的问题解决方法
- 【php】foreach中使用引用引起的问题
- php的array数组 -------方法foreach循环时候,利用数组里值的引用地址(& )从而改变数组里的值
- PHP 数组处理使用foreach、list、each等三个函数详解
- php数组遍历 使用foreach
- php 中 使用foreach为数组增加键值对
- 约瑟夫环问题的 PHP 实现--使用 PHP 数组内部指针操作函数
- 数组与类使用PHP的可变变量名需要的注意的问题
- PHP的foreach中使用引用时需要注意的一个问题和解决方法
- PHP的foreach中使用引用时需要注意的一个问题和解决方法
- PHP学习笔记——使用foreach语句遍历数组的应用