PHP数组foreach时使用&改变值问题

/*
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);
?>

运行结果如下图:

131546_2HO9_2667773.png

为什么第二次打印的是 1 2 3 4 4呢?

此处的$v是一个引用变量,每次foreach的时候,其实有两个过程,取值,再赋值。电脑通过内存地址取值,&的过程,就是将变量的内存地址赋值给变量。

140446_QcIf_2667773.png

                                                          图一

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],因为每次的过程大概为下图

140718_URh7_2667773.png

第一次将arr[0]取出赋值给$v,同时因为$v指向arr[4]的地址,所以会用arr[0]的值覆盖arr[4]的值,往后同理

140909_pmom_2667773.png

140936_Xeu3_2667773.png

141025_BrWJ_2667773.png

最后一次,因为arr[4]已经是4了,所以覆盖自身,仍然是4

141131_y6ea_2667773.png

因此 最后的结果 是1 2 3 4 4。如果将第二个foreach中的$v也换为&$v,那么就会重新改变$v的指向,这种情况下就重复图一的过程,而不会改变$arr的值

转载于:https://my.oschina.net/OSrainn/blog/744230

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值