PHP中foreach循環(huán)中使用引用要注意的地方
更新時(shí)間:2011年01月02日 13:30:01 作者:
發(fā)現(xiàn)了一個(gè)容易出錯(cuò),但是不懂得原理卻解釋不明白的問(wèn)題,碰到類似問(wèn)題的朋友可以參考下。
復(fù)制代碼 代碼如下:
foreach ($array as &$row) {
$row = explode('/', $row);
}
foreach ($array as $row) {
//do something
}
這么寫(xiě),在第二個(gè)循環(huán)會(huì)出邏輯錯(cuò)誤,加入第二個(gè)循環(huán)中do something的地方是輸出$row,循環(huán)到最后一個(gè)的時(shí)候的輸出是倒數(shù)第二個(gè)元素,而不是最后一個(gè)
要這么寫(xiě)
復(fù)制代碼 代碼如下:
foreach ($array as &$row) {
$row = explode('/', $row);
}
unset($row);
foreach ($array as $row) {
//do something
}
或者第一個(gè)循環(huán)這么寫(xiě)
復(fù)制代碼 代碼如下:
foreach ($array as $key => $row) {
$array[$key] = explode('/', $row);
}
說(shuō)一下原理
第一個(gè)循環(huán)使用了引用,循環(huán)結(jié)束后,$row引用的是$array數(shù)組的最后一個(gè)元素,當(dāng)開(kāi)始第二個(gè)循環(huán)的時(shí)候,$row變量每次循環(huán)都會(huì)被賦一個(gè)新值,在php中,如果一個(gè)內(nèi)存空間是被引用的,那么當(dāng)改變它的時(shí)候是直接改變這塊內(nèi)存空間的值,也就是說(shuō),當(dāng)?shù)诙€(gè)foreach的第一次循環(huán),$array的最后一個(gè)元素的值就被改變?yōu)?array的第一個(gè)元素的值,第二次循環(huán)的時(shí)候,改變?yōu)榈诙€(gè)元素的值,倒數(shù)第二次循環(huán)的時(shí)候,被改變?yōu)榈箶?shù)第二個(gè)元素值,而最后一次循環(huán)的時(shí)候得道的值必然是那個(gè)倒數(shù)第二個(gè)值
當(dāng)然,如果php的for循環(huán)有作用域的話,也不會(huì)出現(xiàn)此問(wèn)題.....
相關(guān)文章
將IP地址轉(zhuǎn)換為整型數(shù)字的PHP方法、Asp方法和MsSQL方法、MySQL方法
本篇文章是對(duì)IP地址轉(zhuǎn)換為整型數(shù)字的PHP方法、Asp方法和MsSQL方法、MySQL方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07PHP與MySQL開(kāi)發(fā)的8個(gè)技巧小結(jié)
LAMP 架構(gòu)的網(wǎng)站,我以前注重的多是安裝/配置方面的,講述開(kāi)發(fā)的相對(duì)較少,因?yàn)樽约簭氖麻_(kāi)發(fā)也少。看了以后,頗有啟發(fā),以前開(kāi)發(fā)中遇到的一些問(wèn)題,迎刃而解。所以翻譯出來(lái)和大家共享。2010-12-12PHP使用數(shù)組實(shí)現(xiàn)矩陣數(shù)學(xué)運(yùn)算的方法示例
這篇文章主要介紹了PHP使用數(shù)組實(shí)現(xiàn)矩陣數(shù)學(xué)運(yùn)算的方法,結(jié)合具體實(shí)例形式分析了php基于數(shù)組實(shí)現(xiàn)矩陣表示與運(yùn)算的相關(guān)操作技巧,需要的朋友可以參考下2017-05-05利用PHP判斷是手機(jī)移動(dòng)端還是PC端訪問(wèn)的函數(shù)示例
在平常工作開(kāi)發(fā)中,我們通常需要開(kāi)發(fā)出PC端和移動(dòng)端兩個(gè)不同的系統(tǒng),從而根據(jù)訪問(wèn)端的不同進(jìn)入到不同的操作界面中。下面這篇文章主要給大家介紹了關(guān)于利用PHP判斷是手機(jī)移動(dòng)端還是PC端訪問(wèn)的函數(shù)的相關(guān)資料,需要的朋友可以參考下。2017-12-12