一般情況下,遍歷一個(gè)數(shù)組有三種方法,for、while、foreach。其中最簡(jiǎn)單方便的是foreach。那么它們?cè)诓僮骱托阅苌洗嬖谑裁床顒e,通常使用那種方法比較好。
下面先讓我們來(lái)測(cè)試一下共同遍歷一個(gè)有50000個(gè)下標(biāo)的一維數(shù)組所耗的時(shí)間:
測(cè)試平臺(tái):
CPU:P-M 725
內(nèi)存:512M
硬盤(pán):40G 5400轉(zhuǎn)
OS:Windows xp SP2
WEB:apache 2.0.54 php5.0.4
測(cè)試代碼:
<?php
/*
* @ Author: Lilov
* @ Homepage: www.codesky.com
* @ E-mail: zhongjiechao@Gmail.com
*
*/
$arr = array();
for($i = 0; $i < 50000; $i++){
$arr[] = $i*rand(1000,9999);
}
function GetRunTime()
{
list($usec,$sec)=explode(" ",microtime());
return ((float)$usec+(float)$sec);
}
######################################
$time_start = GetRunTime();
for($i = 0; $i < count($arr); $i++){
$str .= $arr[$i];
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo 'Used time of for:'.round($time_used, 7).'(s)<br><br>';
unset($str, $time_start, $time_end, $time_used);
######################################
$time_start = GetRunTime();
while(list($key, $val) = each($arr)){
$str .= $val;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo 'Used time of while:'.round($time_used, 7).'(s)<br><br>';
unset($str, $key, $val, $time_start, $time_end, $time_used);
######################################
$time_start = GetRunTime();
foreach($arr as $key => $val){
$str .= $val;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo 'Used time of foreach:'.round($time_used, 7).'(s)<br><br>';
######################################
?>
測(cè)試結(jié)果:
將三次測(cè)試結(jié)果求平均值:
分別對(duì)應(yīng)for、while、foreach
0.1311650
0.1666853
0.1237440
經(jīng)過(guò)反復(fù)多次測(cè)試,結(jié)果表明,對(duì)于遍歷同樣一個(gè)數(shù)組,foreach速度最快,最慢的則是while。foreach比while大約快20% ~ 30%左右。隨后再把數(shù)組下標(biāo)增加到500000、5000000測(cè)試結(jié)果也一樣。但從原理上來(lái)看,foreach是對(duì)數(shù)組副本進(jìn)行操作(通過(guò)拷貝數(shù)組),而while則通過(guò)移動(dòng)數(shù)組內(nèi)部指標(biāo)進(jìn)行操作,一般邏輯下認(rèn)為,while應(yīng)該比f(wàn)oreach快(因?yàn)閒oreach在開(kāi)始執(zhí)行的時(shí)候首先把數(shù)組復(fù)制進(jìn)去,而while直接移動(dòng)內(nèi)部指標(biāo)。),但結(jié)果剛剛相反。原因應(yīng)該是,foreach是PHP內(nèi)部實(shí)現(xiàn),而while是通用的循環(huán)結(jié)構(gòu)。
所以,在通常應(yīng)用中我更喜歡用foreach形式,簡(jiǎn)單,而且效率高。在PHP5下, foreach還可以遍歷類(lèi)的屬性。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注