您的位置:首页 > 编程语言 > PHP开发

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 引用赋值