昨天遇到了一個引用的問題
結果是什么,第一時間我也是想當然的回答為[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再指向數組下一個元素得內存地址
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網站題目:php循環引用-創新互聯
當前路徑:http://www.js-pz168.com/article4/coheie.html
成都網站建設公司_創新互聯,為您提供網站策劃、Google、云服務器、網站維護、定制開發、電子商務
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯