PHP循環引用會遇到的坑


今天遇到這樣一個問題:

如果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]

要想不踩這坑,該怎么辦呢?注意變量的聲明!前后盡量不要用一樣的變量名!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM