今天遇到這樣一個問題:
如果foreach循環一個數組,引用去對它的元素做一些操作,會有什麼問題嗎?
比如 [1, 2, 3],foreach循環的時候,引用給每個元素 * 2,再去foreach輸出,結果會是怎麼樣的?
先上代碼,你可以先猜下會輸出什麼哦:
<?php
$arr = [1, 2, 3];
foreach ($arr as &$v) {
echo $v * 2;
echo "<br>";
}
var_dump($arr);
foreach ($arr as $v) {
echo $v * 2;
echo "<br>";
}
var_dump($arr);
有沒有和我一樣以爲兩次輸出都是2 4 6的?事實上,結果如下:
2
4
6
array(3) { [0]=> int(1) [1]=> int(2) [2]=> &int(3) }
2
4
4
array(3) { [0]=> int(1) [1]=> int(2) [2]=> &int(2) }
驚不驚喜意不意外?🤔
這是因爲 foreach
循環時,會將當前元素賦值給 $v
變量,然後進入循環體;
當 foreach
遍歷完成後, $v
變量沒有釋放,而是指向了 arr
數組中的最後一個元素;
所以在後面給 $v
賦值時, 其實改變的是 arr
數組的最後一個元素,所以是最後一個元素一直在引用賦值。
第一個 foreach
循環後,$v
是指向數組的最後一個元素的, 此時 $v
是 2。
在第二個 foreach
循環裏可以 var_dump($arr)
輸出數組看一下變化,可以推斷遍歷過程:
array(3) { [0]=> int(1) [1]=> int(2) [2]=> &int(1) }
array(3) { [0]=> int(1) [1]=> int(2) [2]=> &int(2) }
array(3) { [0]=> int(1) [1]=> int(2) [2]=> &int(2) }
第一次遍歷, 將 arr[0]
賦值給 $v
, 相當於 arr[2]=arr[0]
, 此時 arr
爲: [1, 2, 1]
第二次遍歷, 將 arr[1]
賦值給 $v
, 相當於 arr[2]=arr[1]
, 此時 arr
爲: [1, 2, 2]
第三次遍歷, 將 arr[2]
賦值給 $v
, 相當於 arr[2]=arr[2]
, 此時 arr
爲: [1, 2, 2]