摘要:如何證明我的說法呢可以用下面這段代碼檢驗。那么在這里我們需要特別注意,為了保險起見我們在遍歷數組后,最好手動一下數組,防止出錯這樣就正常了。還有一點手冊也提醒我們了轉成代碼的意思就是遍歷后和是真實存在的,最好使用后能手動掉。
以下所有結論均基于PHP5版本
看下面一段最基礎的foreach遍歷數組代碼。
$value) { echo $key,$value,’
’; //output : 0a1b2c } ?>
輸出為’0a1b2c’自然沒有疑問,那么此過程中$arr,$key,$value究竟是經過怎樣的運算,才輸出這個結果的呢?
其實foreach遍歷過程中,并不是直接操作$arr(原數組)的,而是會將$arr復制出一個$arrcopy(是一個$arr的一個復制品,我這里以$arrcopy代替),foreach在遍歷過程中操作的其實一直是$arrcopy。
注:關于$arrcopy這個值我們是沒辦法提取出來的,因為這是我給他的命名,并沒有存在這個變量,但是foreach遍歷過程中確實會產生這么一個副本,這兒為了方便講述我用$arrCopy代表。
Foreach遍歷大概的流程是這樣(偽代碼):
’; } //firt loop end //second loop $key = currentKey($arrCopy); //將獲取到的值分配給$k; $val = currentVal($arrCopy); //將獲取到的值分配給$v; ……… //seconde loop end ?>
這就是foreach代碼的運行流程,總結一句話就是foreach遍歷操作的時候并不是原始數組,而是一個拷貝數組,但是每次循環的結尾都會將副本重新賦值回給原數組$arr = $arrCopy;。
如何證明我的說法呢?可以用下面這段代碼檢驗。
$value) { $arr[] = "d"; print_r($arr); var_dump($key,$value); } ?>
輸出結果為:
//output: Array ( [0] => a [1] => b [2] => c [3] => d ) int(0) string(1) "a" Array ( [0] => a [1] => b [2] => c [3] => d [4] => d ) int(1) string(1) "b" Array ( [0] => a [1] => b [2] => c [3] => d [4] => d [5] => d ) int(2) string(1) "c"
同學們看出來了嗎?
$arr數組的鍵值對一直在在增加,可是$key,$value的值到了int(2),string(1) “c”就結束了,并沒有如我們所料的將值為d的那些鍵值對打印出來。
這兒就能證明,foreach遍歷過程操作的是$arr的副本($arrcopy)。
對了,foreach使用過程中還有一些小地方需要注意。
例如foreach遍歷數組的指針問題:
$value) { } var_dump(current($arr)); //output:bool(false) ?>
兩次輸出,不一樣的結果。為什么呢?因為foreach循環遍歷后的數組,該數組的指針是指向末尾的(此處的話指針就是在’c’的右邊),并且使用完畢后不會幫我們復位,所以我們var_dump(current($arr))為 bool(false)。
那么在這里我們需要特別注意,為了保險起見我們在foreach遍歷數組后,最好手動reset()一下數組,防止出錯:
$value) { } reset($arr); var_dump(current($arr)); / output:string(1) "a" ?>
這樣就正常了。
還有一點PHP手冊也提醒我們了:
轉成代碼的意思就是:
$value) { } var_dump($key); var_dump($value); ?>
Foreach遍歷后,$key和$value是真實存在的,最好使用后能手動unset()掉。
總結:foreach算是PHP里面比較復雜的一個函數了,因為牽扯到PHP底層的C語言的結構體,引用(is_ref__gc),指針移動……,所以在使用foreach的時候一定要特別注意啊!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/30337.html
摘要:中基礎中的三大坑,遍歷,引用機制,數組。今天我們在講講中的一些奇怪現象。本文適合有一定基礎的。運行流程共用一個結構體開始遍歷數組,進行判斷,拷貝數組是一個新的結構體,操作的是新的結構體。那么遍歷數組時,全程與原數組無關。 PHP中基礎中的三大坑,foreach遍歷,引用機制&,數組。 今天我們在講講foreach中的一些奇怪現象。 在講解之前,可以先看看我其他相關的文章,屬于同一個大的...
摘要:我們為了處理這些挑戰,提出了一個新的引用測試框架當然,也是開源的,并且在整個過程中節省了上百萬美元。另一方面,被證實有一些嚴重的缺點部署困難而且慢。在緩存刷新期間,當可用于別的進程的已緩存的文件字節碼在此時損壞,就會導致崩潰。 How Badoo saved one million dollars switching to PHP7 我們成功的把我們的應用遷移到了php7上面(數百臺機...
摘要:截止到目前為止,官方已經發布了的版本,距離發布第一個正式版本不會很遠了現在來說的重大特性肯定已經是定型了,不會再有什么變動了。 截止到目前為止,PHP官方已經發布了php7的RC7版本,距離發布第一個正式版本不會很遠了!現在來說php7的重大特性肯定已經是定型了,不會再有什么變動了。后續一些版本的迭代主要也就是修修bug,優化之類的。下面就來說話我們一直期待的php7會有那些主要的變化...
摘要:這種行為比最初出現的問題更為棘手,同時也是一種常見的錯誤源。這意味著這個數組的一份拷貝將會被返回,因此被調函數與調用者所訪問的數組并不是同樣的數組實例。 showImg(https://segmentfault.com/img/bV7reP?w=620&h=620); PHP 語言讓 WEB 端程序設計變得簡單,這也是它能流行起來的原因。但也是因為它的簡單,PHP 也慢慢發展成一個相對...
摘要:建議使用來將其銷毀。那為何一直是,一直是呢先用查看編譯后的新特性之循環對數組內部指針不再起作用在之前當數據通過迭代時數組指針會移動。版本結果說明數組指針會移動數據指針不再移動按照值進行循環時對數組的修改是不會影響循環。 招聘 標簽(空格分隔): 招聘 PHP 國貿 語言基礎 foreach 語法結構提供了遍歷數組的簡單方式。 php5之前, foreach僅能用于數組php5+, 利...
閱讀 2416·2021-11-18 10:02
閱讀 1929·2021-10-13 09:40
閱讀 3008·2021-09-07 10:07
閱讀 2116·2021-09-04 16:48
閱讀 1015·2019-08-30 13:18
閱讀 2462·2019-08-29 14:03
閱讀 2929·2019-08-29 12:54
閱讀 3167·2019-08-26 11:41