引用原文:http://old.ruesin.com/php/loop-array-87.htmlPHP遍歷數(shù)組常用方法foreach,for,while的性能比較
整體效果來看:while的性能是最差的毙玻,其次是for豌蟋,而執(zhí)行效率最快的是foreach,特別是沒有使用$key時桑滩。
foreach/for
for循環(huán)是PHP中最復(fù)雜的循環(huán)結(jié)構(gòu)梧疲。expr1 在循環(huán)開始前無條件求值一次允睹。expr2 在每次循環(huán)開始前求值。expr3 在每次循環(huán)之后被求值(執(zhí)行)幌氮。
而對于遍歷數(shù)組for需要知道數(shù)組長度再用$i++來操作缭受,一次循環(huán)要進(jìn)行多次條件判斷或計(jì)算,而foreach不需要進(jìn)行計(jì)算和判斷该互,可自動檢測并輸入key,和value米者。
foreach 有key/無key
foreach (array as $value)遍歷給定的 array 數(shù)組。每次循環(huán)中宇智,當(dāng)前單元的值被賦給 $value 并且數(shù)組內(nèi)部的指針向前移一步蔓搞。
foreach (array as $key => $value)不僅要有上述操作,而且當(dāng)前單元的鍵值也會在每次循環(huán)中被賦給變量$key随橘。
文章來自ruesin.com
foreach/while
foreach是對數(shù)組副本進(jìn)行操作(通過拷貝數(shù)組)喂分,而while則通過移動數(shù)組內(nèi)部指標(biāo)進(jìn)行操作,一般邏輯下認(rèn)為机蔗,while應(yīng)該比foreach快(因?yàn)閒oreach在開始執(zhí)行的時候首先把數(shù)組復(fù)制進(jìn)去蒲祈,而while直接移動內(nèi)部指標(biāo)。)萝嘁,但結(jié)果剛剛相反梆掸。原因應(yīng)該是,foreach是PHP內(nèi)部實(shí)現(xiàn)牙言,而while是通用的循環(huán)結(jié)構(gòu)酸钦。
而PHP內(nèi)部的復(fù)制機(jī)制是“引用計(jì)數(shù),寫時復(fù)制”咱枉,也就是說钝鸽,即便在PHP里復(fù)制一個變量,最初的形式從根本上說其實(shí)仍然是引用的形式庞钢,只有當(dāng)變量的內(nèi)容發(fā)生變化時,才會出現(xiàn)真正的復(fù)制因谎,之所以這么做是出于節(jié)省內(nèi)存消耗得目的基括,同時也提升了復(fù)制的效率。
for/while
理論上感覺這兩個應(yīng)該是一樣的啊,循環(huán)/計(jì)算/判斷/循環(huán)…? 可是為什么性能差這么多? 希望有哪位朋友看到能講解一下.
注: 當(dāng) foreach 開始執(zhí)行時财岔,數(shù)組內(nèi)部的指針會自動指向第一個單元风皿。這意味著不需要在 foreach 循環(huán)之前調(diào)用 reset()。
注: 除非數(shù)組是被引用匠璧,foreach 所操作的是指定數(shù)組的一個拷貝桐款,而不是該數(shù)組本身。因此數(shù)組指針不會被 each() 結(jié)構(gòu)改變夷恍,對返回的數(shù)組單元的修改也不會影響原數(shù)組魔眨。
注: foreach 不支持用“@”來禁止錯誤信息的能力。
注: 自php5起,foreach 可以很容易地通過在 $value 之前加上 & 來修改數(shù)組的單元遏暴,此方法將以引用賦值而不是拷貝一個值侄刽。