在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不銷燬最後一個元素,所以當第一個循環結束時,我們有了一個隱藏的變量
而我們在第二個循環中繼續以