1. 程式人生 > >php 循環引用

php 循環引用

變量 images 讓我 mage c4c 一次循環 打印 com int

昨天遇到了一個引用的問題
技術分享圖片
結果是什麽,第一時間我也是想當然的回答為[1,2,3]

但是實際的結果卻讓我大跌眼鏡 正確的結果為[2,3,3]
技術分享圖片
經過我一番思考和討論 我大概分析了其運行的流程和為什麽會是[2,3,3]這個結果
首先這個引用是兩個或多個變量指向同一個內存地址如下圖
技術分享圖片
$a = 5;
$b = &$a;
這樣他們便指向同一個內存地址不管你改變$a還是$b得值,另外一個值都會跟著改變
現在讓我回到那個循環

$arr = [1,2,3];
foreach ($arr as $key => $value) {
$value = &$arr[$key];
print_r($arr);
}

從代碼可以看出$value指向了數組中每個元素得地址,如果$value得值發生了變化即數組中得值也會變化

第一次循環
$keyt=0 $value = 1 1 = $arr[0] 此時$value這個變量已經指向了$arr數組中第一個元素得位置就是1得內存位置
所以當一次循環結束打印得數組為
技術分享圖片


第二次循環
這是重點,因為第一次循環$value這個變量已經指向了$arr數組中第一個元素得位置就是1得內存位置,當第二循環剛剛開始,還沒有運行到$value = &$arr[$key];這行,此時第二次循環已經把 $value得值變為了2,因為第一次循環 $value指向數組$arr元素1的位置,所以當第二次循環剛開始$value得值變為了2,所以$arr中第一元素就變為2,繼續往下運行到$value = &$arr[$key]; 2 = &$arr[1]此時$value指向得地址就變為$arr第二個元素得內存位置,同時把第二個元素賦值為2

技術分享圖片


第三次循環$value已經指向了數組$arr第二個元素得位置,所以循環剛開始$value得值就被賦值了3,即數組得第二個元素是3,此時再往下運行$value = &$arr[$key]; 3= &$arr[2] 素組得第三個元素還是3,$value指向數組得第三個元素得位置
技術分享圖片
到此整個數組循環結束結果就是[2,3,3] 同理如果數組再加一個4必然回事[2,3,4,4]

總結
當第一次循環結束時,建立多對一得內存地址映射,以後得每次循環都會先改變$value對應內存地址得值,即數組元素得值,然後$value再指向數組下一個元素得內存地址

php 循環引用