現(xiàn)在的Web開發(fā)離不開PHP,它是一門簡單易學(xué)的語言,但不代表在處理數(shù)據(jù)時效率不高。通過優(yōu)化代碼可以提高程序的效率,其中foreach語句是PHP中一個常用的循環(huán)語句,但是很多同學(xué)對它的效率并不了解,本文將詳細(xì)介紹PHP foreach的速度問題。
foreach語句適用于遍歷數(shù)組,可以通過鍵值對進行訪問,比如:
$fruit = array("apple", "orange", "banana"); foreach($fruit as $f){ echo $f; }
這個foreach循環(huán)會將$fruit數(shù)組中的每個元素以序列的方式遍歷出來。而通過鍵值對進行訪問的方式如下所示:
$fruit = array("apple" =>1, "orange" =>1, "banana" =>1); foreach($fruit as $key =>$val){ echo $key . "=>" . $val . "
"; }
這個循環(huán)會將數(shù)組中的鍵和值以鍵值對的方式遍歷出來。
然而,foreach語句的速度問題是網(wǎng)絡(luò)上眾所周知的。要想更好的理解foreach的速度問題,我們需要進行各種實驗以及比較,下面就用幾個示例來展示foreach語句的速度問題。
示例1:我們從1到10000生成一個數(shù)字?jǐn)?shù)組,然后使用for循環(huán)和foreach循環(huán)進行數(shù)組遍歷,記錄整個程序的執(zhí)行時間:
$nums = array(); for ($i=0; $i<10000; $i++){ $nums[$i] = $i; } $beginTime = microtime(true); // 獲取微秒級時間戳 for ($i=0; $i<10000; $i++){ $nums[$i]; } $endTime = microtime(true); // 獲取微秒級時間戳 $costTime = $endTime - $beginTime; echo "for循環(huán)花費的時間為:" . $costTime . "s
"; // foreach循環(huán) $beginTime = microtime(true); // 獲取微秒級時間戳 foreach($nums as $val){ } $endTime = microtime(true); // 獲取微秒級時間戳 $costTime = $endTime - $beginTime; echo "foreach循環(huán)花費的時間為:" . $costTime . "s
";
這個示例是一個最簡化的遍歷數(shù)組的程序,實驗結(jié)果卻讓我們大吃一驚。通過執(zhí)行時間和內(nèi)存占用進行對比,有同學(xué)得出的結(jié)論是,當(dāng)遍歷數(shù)組時,使用for語句比foreach語句快2倍。這個結(jié)論可能會讓一些php初學(xué)者非常困惑。
示例2:這個示例是采用PHP的數(shù)組函數(shù)進行操作。我們先使用range()函數(shù)生成一個1-10000的數(shù)組,然后用array_flip()函數(shù)進行反轉(zhuǎn)。最后執(zhí)行一個遍歷:
$nums = range(1,10000); $nums = array_flip($nums); $beginTime = microtime(true); // 獲取微秒級時間戳 foreach($nums as $val){ } $endTime = microtime(true); // 獲取微秒級時間戳 $costTime = $endTime - $beginTime; echo "foreach循環(huán)花費的時間為:" . $costTime . "s
";
實驗結(jié)果卻讓習(xí)慣于使用for循環(huán)的工程師們悔恨莫及。第二個示例用foreach語句在數(shù)組操作中比for循環(huán)快得多。
從這兩個示例可以看出,foreach循環(huán)的速度是有時快有時慢的。為什么會這樣呢?因為php在執(zhí)行foreach循環(huán)時,需要創(chuàng)建一個新的數(shù)組對象,所以foreach語句比for循環(huán)慢。但是,在數(shù)組中的數(shù)據(jù)非常多時使用foreach語句會更快,原因在于PHP的內(nèi)置函數(shù)在大型數(shù)組中的執(zhí)行速度更快。
總之,在代碼編寫過程中,我們需要根據(jù)具體的情況來選擇使用for循環(huán)還是foreach循環(huán),既要考慮執(zhí)行時間,也要考慮程序內(nèi)存占用。希望本文能幫助大家更好地理解foreach語句的速度問題。