php foreach & 地址引用 的时候碰到的坑

转载自https://blog.csdn.net/lambert310/article/details/77938088
这个地方最好找个数组自己试验下 最后一个

//简称1  
foreach($data as $key=>&$valeu)
{

}
//当再次foreach $data数组时候 简称 2
foreach($data as $key=>$value)
{
}
2 中的结果可能因为1中的地址引用 每个$value不一定是你预想的循环的那样    解决办法如下  unset($value)  再详细的看下文的PHP官网函数介绍 


以下内容转载自他人博客

在PHP中,array是最常用的结构了,可以当做队列、堆栈、hash等结构使用,所以遍历array最常用的foreach循环,我们用得很多,但其实foreach循环中有一个隐藏的坑,如下代码:

<?php

$arr = [1,2,4];

foreach($arr as &$a){
    $a = $a*$a;
}

print_r($arr);

foreach($arr as $a){
    print_r($a);
}

此时打印出$arr的结果是1、4、9

但第二个循环中打印出的结果是1、4、4

为什么会出现这个问题呢?

详见手册:http://php.net/manual/zh/control-structures.foreach.php

Warning 数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。

而在foreach的实现里,每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步。

当我们在第一个foreach中以引用的方式使用元素,循环结束之后,$v 其实是数组最后一个元素的引用。

由于foreach不销毁最后一个元素,所以当第一个循环结束时,我们有了一个隐藏的变量v,它是指向数组v,它是指向数组arr 最后一个元素的引用。

而我们在第二个循环中继续以v命名,则会让v命名,则会让v指向的元素不断的被覆盖。从而使得第二个循环中,最后一次循环时得到的值和倒数第二次循环时相同。

原文地址:https://www.cnblogs.com/liuqun/p/12655143.html