首页 » 小蓝 » 从一段代码剖释PHP foreach做了什么

从一段代码剖释PHP foreach做了什么

从一段代码剖释PHP foreach做了什么

当我们使用 foreach 的时候,php到底在做什么?我们看一段代码


$arr = [ 1 , 2 , 3 ];

foreach($arr as $key => &$value){
    $value *= 2;
}
// [2,4,6]

foreach($arr as $key => $value){
    echo $value;
}
// 2,4,4   why ?

为什么不是输出 2 , 4 , 6 ? 要解决这个谜题,我们需要搞清楚foreach到底做了什么。
以下均为伪代码:

foreach($arr as $key => &$value){
    /* 
    1.首先 php 会内部执行  
    $key = key($arr);
    $value =  & current($arr); 
    注,因为上面代码使用 &$value 所以此处也是引用
    */
    $value *= 2;
}
//第一部分没有问题,正如你理解一样
//但是重点来了,这个时候 $value 仍然是 $arr 最后一个元素的引用

foreach($arr as $key = $value){
    /* 
    1.首先 php 会内部执行  
    $key = key($arr);
    $value =  current($arr); 
    注,结合上面的情况,第一循环相当于
    ( $arr[2] = $arr[0] )
    所以第一循环以后,数组变成 2 , 4 , 2 ;想想为什么?
    同理,第二循环相当于 $arr[2] = $arr[1],
    数组变成 2 , 4 , 4
    第二循环相当于 $arr[2] = $arr[2],
    数组还是 2 , 4 , 4
    */
}

疑难得解,那么怎么解决?

方法一,不用引用


foreach($arr as $key => $value){
    $arr[$key] = $value * 2;
}

方法二,unset引用变量

foreach($arr as $key => &$value){
    $value *= 2;
}
unset($value);