国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

當(dāng)我們使用foreach時(shí),內(nèi)部究竟發(fā)生了什么(PHP5)?

paulli3 / 1450人閱讀

摘要:如何證明我的說法呢可以用下面這段代碼檢驗(yàn)。那么在這里我們需要特別注意,為了保險(xiǎn)起見我們?cè)诒闅v數(shù)組后,最好手動(dòng)一下數(shù)組,防止出錯(cuò)這樣就正常了。還有一點(diǎn)手冊(cè)也提醒我們了轉(zhuǎn)成代碼的意思就是遍歷后和是真實(shí)存在的,最好使用后能手動(dòng)掉。

以下所有結(jié)論均基于PHP5版本
看下面一段最基礎(chǔ)的foreach遍歷數(shù)組代碼。

 $value) {
    echo $key,$value,’
’; //output : 0a1b2c } ?>

輸出為’0a1b2c’自然沒有疑問,那么此過程中$arr,$key,$value究竟是經(jīng)過怎樣的運(yùn)算,才輸出這個(gè)結(jié)果的呢?

其實(shí)foreach遍歷過程中,并不是直接操作$arr(原數(shù)組)的,而是會(huì)將$arr復(fù)制出一個(gè)$arrcopy(是一個(gè)$arr的一個(gè)復(fù)制品,我這里以$arrcopy代替),foreach在遍歷過程中操作的其實(shí)一直是$arrcopy。
注:關(guān)于$arrcopy這個(gè)值我們是沒辦法提取出來的,因?yàn)檫@是我給他的命名,并沒有存在這個(gè)變量,但是foreach遍歷過程中確實(shí)會(huì)產(chǎn)生這么一個(gè)副本,這兒為了方便講述我用$arrCopy代表。
Foreach遍歷大概的流程是這樣(偽代碼):

’;
}
//firt loop end

//second loop 
$key = currentKey($arrCopy); //將獲取到的值分配給$k;
$val = currentVal($arrCopy); //將獲取到的值分配給$v;
………
//seconde loop end
?>

這就是foreach代碼的運(yùn)行流程,總結(jié)一句話就是foreach遍歷操作的時(shí)候并不是原始數(shù)組,而是一個(gè)拷貝數(shù)組,但是每次循環(huán)的結(jié)尾都會(huì)將副本重新賦值回給原數(shù)組$arr = $arrCopy;。

如何證明我的說法呢?可以用下面這段代碼檢驗(yàn)。

 $value) {
    $arr[] = "d";
    print_r($arr);
    var_dump($key,$value);
}
?>

輸出結(jié)果為:


//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"

同學(xué)們看出來了嗎?
$arr數(shù)組的鍵值對(duì)一直在在增加,可是$key,$value的值到了int(2),string(1) “c”就結(jié)束了,并沒有如我們所料的將值為d的那些鍵值對(duì)打印出來。
這兒就能證明,foreach遍歷過程操作的是$arr的副本($arrcopy)。

對(duì)了,foreach使用過程中還有一些小地方需要注意。
例如foreach遍歷數(shù)組的指針問題:

 
 $value) {

}
var_dump(current($arr)); //output:bool(false)
?>

兩次輸出,不一樣的結(jié)果。為什么呢?因?yàn)閒oreach循環(huán)遍歷后的數(shù)組,該數(shù)組的指針是指向末尾的(此處的話指針就是在’c’的右邊),并且使用完畢后不會(huì)幫我們復(fù)位,所以我們var_dump(current($arr))為 bool(false)。
那么在這里我們需要特別注意,為了保險(xiǎn)起見我們?cè)趂oreach遍歷數(shù)組后,最好手動(dòng)reset()一下數(shù)組,防止出錯(cuò):

 $value) {

}
reset($arr);
var_dump(current($arr)); / output:string(1) "a"
?>

這樣就正常了。

還有一點(diǎn)PHP手冊(cè)也提醒我們了:

轉(zhuǎn)成代碼的意思就是:

 $value) {

}
var_dump($key);
var_dump($value);
?>

Foreach遍歷后,$key和$value是真實(shí)存在的,最好使用后能手動(dòng)unset()掉。

總結(jié):foreach算是PHP里面比較復(fù)雜的一個(gè)函數(shù)了,因?yàn)闋砍兜絇HP底層的C語言的結(jié)構(gòu)體,引用(is_ref__gc),指針移動(dòng)……,所以在使用foreach的時(shí)候一定要特別注意啊!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/30337.html

相關(guān)文章

  • foreach遍歷過程中的奇怪現(xiàn)象(PHP5

    摘要:中基礎(chǔ)中的三大坑,遍歷,引用機(jī)制,數(shù)組。今天我們?cè)谥v講中的一些奇怪現(xiàn)象。本文適合有一定基礎(chǔ)的。運(yùn)行流程共用一個(gè)結(jié)構(gòu)體開始遍歷數(shù)組,進(jìn)行判斷,拷貝數(shù)組是一個(gè)新的結(jié)構(gòu)體,操作的是新的結(jié)構(gòu)體。那么遍歷數(shù)組時(shí),全程與原數(shù)組無關(guān)。 PHP中基礎(chǔ)中的三大坑,foreach遍歷,引用機(jī)制&,數(shù)組。 今天我們?cè)谥v講foreach中的一些奇怪現(xiàn)象。 在講解之前,可以先看看我其他相關(guān)的文章,屬于同一個(gè)大的...

    kgbook 評(píng)論0 收藏0
  • Badoo 告訴你切換到 PHP7 節(jié)省 100 萬美元

    摘要:我們?yōu)榱颂幚磉@些挑戰(zhàn),提出了一個(gè)新的引用測試框架當(dāng)然,也是開源的,并且在整個(gè)過程中節(jié)省了上百萬美元。另一方面,被證實(shí)有一些嚴(yán)重的缺點(diǎn)部署困難而且慢。在緩存刷新期間,當(dāng)可用于別的進(jìn)程的已緩存的文件字節(jié)碼在此時(shí)損壞,就會(huì)導(dǎo)致崩潰。 How Badoo saved one million dollars switching to PHP7 我們成功的把我們的應(yīng)用遷移到了php7上面(數(shù)百臺(tái)機(jī)...

    biaoxiaoduan 評(píng)論0 收藏0
  • PHP7新特性的介紹

    摘要:截止到目前為止,官方已經(jīng)發(fā)布了的版本,距離發(fā)布第一個(gè)正式版本不會(huì)很遠(yuǎn)了現(xiàn)在來說的重大特性肯定已經(jīng)是定型了,不會(huì)再有什么變動(dòng)了。 截止到目前為止,PHP官方已經(jīng)發(fā)布了php7的RC7版本,距離發(fā)布第一個(gè)正式版本不會(huì)很遠(yuǎn)了!現(xiàn)在來說php7的重大特性肯定已經(jīng)是定型了,不會(huì)再有什么變動(dòng)了。后續(xù)一些版本的迭代主要也就是修修bug,優(yōu)化之類的。下面就來說話我們一直期待的php7會(huì)有那些主要的變化...

    klivitamJ 評(píng)論0 收藏0
  • 十個(gè) PHP 開發(fā)者最容易犯的錯(cuò)誤

    摘要:這種行為比最初出現(xiàn)的問題更為棘手,同時(shí)也是一種常見的錯(cuò)誤源。這意味著這個(gè)數(shù)組的一份拷貝將會(huì)被返回,因此被調(diào)函數(shù)與調(diào)用者所訪問的數(shù)組并不是同樣的數(shù)組實(shí)例。 showImg(https://segmentfault.com/img/bV7reP?w=620&h=620); PHP 語言讓 WEB 端程序設(shè)計(jì)變得簡單,這也是它能流行起來的原因。但也是因?yàn)樗暮唵危琍HP 也慢慢發(fā)展成一個(gè)相對(duì)...

    fireflow 評(píng)論0 收藏0
  • 深入理解PHP之foreach

    摘要:建議使用來將其銷毀。那為何一直是,一直是呢先用查看編譯后的新特性之循環(huán)對(duì)數(shù)組內(nèi)部指針不再起作用在之前當(dāng)數(shù)據(jù)通過迭代時(shí)數(shù)組指針會(huì)移動(dòng)。版本結(jié)果說明數(shù)組指針會(huì)移動(dòng)數(shù)據(jù)指針不再移動(dòng)按照值進(jìn)行循環(huán)時(shí)對(duì)數(shù)組的修改是不會(huì)影響循環(huán)。 招聘 標(biāo)簽(空格分隔): 招聘 PHP 國貿(mào) 語言基礎(chǔ) foreach 語法結(jié)構(gòu)提供了遍歷數(shù)組的簡單方式。 php5之前, foreach僅能用于數(shù)組php5+, 利...

    Lemon_95 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<