新聞中心
昨天遇到了一個(gè)引用的問(wèn)題
結(jié)果是什么,第一時(shí)間我也是想當(dāng)然的回答為[1,2,3]
但是實(shí)際的結(jié)果卻讓我大跌眼鏡 正確的結(jié)果為[2,3,3]
經(jīng)過(guò)我一番思考和討論 我大概分析了其運(yùn)行的流程和為什么會(huì)是[2,3,3]這個(gè)結(jié)果
首先這個(gè)引用是兩個(gè)或多個(gè)變量指向同一個(gè)內(nèi)存地址如下圖
$a = 5;
$b = &$a;
這樣他們便指向同一個(gè)內(nèi)存地址不管你改變$a還是$b得值,另外一個(gè)值都會(huì)跟著改變
現(xiàn)在讓我回到那個(gè)循環(huán)
$arr = [1,2,3];
foreach ($arr as $key => $value) {
$value = &$arr[$key];
print_r($arr);
}
從代碼可以看出$value指向了數(shù)組中每個(gè)元素得地址,如果$value得值發(fā)生了變化即數(shù)組中得值也會(huì)變化
第一次循環(huán)
$keyt=0 $value = 1 1 = $arr[0] 此時(shí)$value這個(gè)變量已經(jīng)指向了$arr數(shù)組中第一個(gè)元素得位置就是1得內(nèi)存位置
所以當(dāng)一次循環(huán)結(jié)束打印得數(shù)組為
第二次循環(huán)
這是重點(diǎn),因?yàn)榈谝淮窝h(huán)$value這個(gè)變量已經(jīng)指向了$arr數(shù)組中第一個(gè)元素得位置就是1得內(nèi)存位置,當(dāng)?shù)诙h(huán)剛剛開(kāi)始,還沒(méi)有運(yùn)行到$value = &$arr[$key];這行,此時(shí)第二次循環(huán)已經(jīng)把 $value得值變?yōu)榱?,因?yàn)榈谝淮窝h(huán) $value指向數(shù)組$arr元素1的位置,所以當(dāng)?shù)诙窝h(huán)剛開(kāi)始$value得值變?yōu)榱?,所以$arr中第一元素就變?yōu)?,繼續(xù)往下運(yùn)行到$value = &$arr[$key]; 2 = &$arr[1]此時(shí)$value指向得地址就變?yōu)?arr第二個(gè)元素得內(nèi)存位置,同時(shí)把第二個(gè)元素賦值為2
第三次循環(huán)$value已經(jīng)指向了數(shù)組$arr第二個(gè)元素得位置,所以循環(huán)剛開(kāi)始$value得值就被賦值了3,即數(shù)組得第二個(gè)元素是3,此時(shí)再往下運(yùn)行$value = &$arr[$key]; 3= &$arr[2] 素組得第三個(gè)元素還是3,$value指向數(shù)組得第三個(gè)元素得位置
到此整個(gè)數(shù)組循環(huán)結(jié)束結(jié)果就是[2,3,3] 同理如果數(shù)組再加一個(gè)4必然回事[2,3,4,4]
總結(jié)
當(dāng)?shù)谝淮窝h(huán)結(jié)束時(shí),建立多對(duì)一得內(nèi)存地址映射,以后得每次循環(huán)都會(huì)先改變$value對(duì)應(yīng)內(nèi)存地址得值,即數(shù)組元素得值,然后$value再指向數(shù)組下一個(gè)元素得內(nèi)存地址
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
新聞標(biāo)題:php循環(huán)引用-創(chuàng)新互聯(lián)
URL標(biāo)題:http://www.dlmjj.cn/article/coheie.html