PHP foreach使用 &引用 的坑

在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 arr 最後一個元素的引用。

而我們在第二個循環中繼續以v v指向的元素不斷的被覆蓋。從而使得第二個循環中,最後一次循環時得到的值和倒數第二次循環時相同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章