while循環(huán)語(yǔ)句
while循環(huán)是PHP中最簡(jiǎn)單的循環(huán)類型。其基本格式如下:while (expr) statement
while語(yǔ)句的含義很簡(jiǎn)單,它告訴PHP只要while表達(dá)式的值為TRUE,就重復(fù)執(zhí)行嵌套中的循環(huán)語(yǔ)句。表達(dá)式的值在每次開始循環(huán)時(shí)檢查,所以即使這個(gè)值在循環(huán)語(yǔ)句中改變了,語(yǔ)句也不會(huì)停止執(zhí)行,直到本次循環(huán)結(jié)束。有時(shí)如果while表達(dá)式的值一開始就是FALSE,則循環(huán)語(yǔ)句一次都不會(huì)執(zhí)行。
例如,下面兩個(gè)循環(huán)語(yǔ)句完全一樣,都顯示數(shù)字1到10。
<?php$i = 1;while ($i <= 10) { echo $i++;}$i = 1;while ($i <= 10) { print $i; $i++;}?>
do-while循環(huán)語(yǔ)句
do-while與while循環(huán)非常相似,區(qū)別在于表達(dá)式的值是在每次循環(huán)結(jié)束時(shí)檢查而不是在開始時(shí),因此do-while循環(huán)語(yǔ)句保證會(huì)執(zhí)行一次循環(huán),而while循環(huán)就不一定了,如果表達(dá)式的值為false則整個(gè)循環(huán)立即終止。如:
<?php$i = 0;do { echo $i;} while ($i > 0);?>
在上面示例中,循環(huán)正好運(yùn)行一次,因?yàn)榻?jīng)過(guò)第一次循環(huán)后,當(dāng)檢查表達(dá)式的真值時(shí),其值為false($i不大于0)而導(dǎo)致循環(huán)終止。
for循環(huán)語(yǔ)句
for循環(huán)是PHP中最復(fù)雜的循環(huán)結(jié)構(gòu)。它的行為與C語(yǔ)言的相似。其語(yǔ)法格式如下:
for (expr1; expr2; expr3) statement
第一個(gè)表達(dá)式(expr1)在循環(huán)開始前無(wú)條件求值一次。第二個(gè)表達(dá)式expr2在每次循環(huán)開始前求值。如果值為true,則繼續(xù)循環(huán),執(zhí)行嵌套的循環(huán)語(yǔ)句。如果值為false,則終止循環(huán)。第三個(gè)表達(dá)式expr3在每次循環(huán)之后被求值(執(zhí)行)。每個(gè)表達(dá)式都可以為空或包括逗號(hào)分隔的多個(gè)表達(dá)式。表達(dá)式expr2中,所有用逗號(hào)分隔的表達(dá)式都會(huì)計(jì)算,但只取最后一個(gè)結(jié)果。expr2為空,PHP會(huì)認(rèn)為其值為true,意味著將無(wú)限循環(huán)下去。這可能不像想象中那樣沒(méi)有用,因?yàn)榻?jīng)常會(huì)希望用break語(yǔ)句來(lái)結(jié)束循環(huán)而不是用for的表達(dá)式真值判斷。例如,下面示例中4個(gè)循環(huán)結(jié)構(gòu)將顯示1到10數(shù)字。
<?php/*循環(huán)1 */for ($i = 1; $i <= 10; $i++) { echo $i;}/*循環(huán)2*/for ($i = 1; ; $i++) { if ($i > 10) { break; } echo $i;}/*循環(huán)3 */$i = 1;for (;;) { if ($i > 10) { break; } echo $i; $i++;}/*循環(huán)4 */for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);?>
在上面示例中第一個(gè)循環(huán)結(jié)構(gòu)比較常見(jiàn),但是后面3種循環(huán)形式在特殊情況下比較實(shí)用,建議用戶靈活掌握它們,學(xué)會(huì)在for循環(huán)中使用空的表達(dá)式有時(shí)會(huì)發(fā)現(xiàn)很方便。for循環(huán)經(jīng)常用在遍歷操作,例如,在下面示例中對(duì)數(shù)組進(jìn)行遍歷,以便改變數(shù)組中某些元素的值。
<?php$people = Array( Array('name' => 'Kalle', 'salt' => 856412), Array('name' => 'Pierre', 'salt' => 215863) );for($i = 0; $i < sizeof($people); ++$i){ $people[$i]['salt'] = rand(000000, 999999);}?>
在上面代碼中,for的第二個(gè)表達(dá)式需要獲取數(shù)組的長(zhǎng)度,因此每次循環(huán)時(shí)都要計(jì)算一遍數(shù)組的長(zhǎng)度,這樣就影響到循環(huán)的執(zhí)行效率。由于數(shù)組的長(zhǎng)度始終不變,可以使用一個(gè)中間變量來(lái)存儲(chǔ)數(shù)組長(zhǎng)度,然后用這個(gè)變量作為for循環(huán)的第二個(gè)表達(dá)式。這樣在循環(huán)時(shí)就可以直接使用該變量的值,不用每次重新計(jì)算。如:
<?php$people = Array( Array('name' => 'Kalle', 'salt' => 856412), Array('name' => 'Pierre', 'salt' => 215863) );for($i = 0, $size = sizeof($people); $i < $size; ++$i){ $people[$i]['salt'] = rand(000000, 999999);}?>
foreach循環(huán)語(yǔ)句
PHP 4引入了foreach結(jié)構(gòu),該結(jié)構(gòu)僅能用于數(shù)組,當(dāng)試圖將其用于其他數(shù)據(jù)類型或者一個(gè)未初始化的變量時(shí)會(huì)產(chǎn)生錯(cuò)誤,因此可以把它視為一種遍歷數(shù)組的簡(jiǎn)便方法。foreach結(jié)構(gòu)有兩種語(yǔ)法:
foreach (array_expression as $value) statementforeach (array_expression as $key => $value) statement
第一種格式遍歷給定的array-expression數(shù)組。每次循環(huán)中,當(dāng)前單元的值被賦予給變量$value,并且數(shù)組內(nèi)部的指針向前移一步,因此下一次循環(huán)中將會(huì)得到下一個(gè)單元。第二種格式與第一種循環(huán)格式相同,只是它不僅獲取每個(gè)單元的值,還可以獲取單元的鍵名,其中當(dāng)前單元的鍵名也會(huì)在每次循環(huán)中被賦給變量$key。雖然這種格式不常用,但它是第一種格式的有益擴(kuò)展。自PHP 5起,foreach結(jié)構(gòu)還可以遍歷對(duì)象。
當(dāng)foreach開始執(zhí)行時(shí),數(shù)組內(nèi)部的指針會(huì)自動(dòng)指向第一個(gè)單元。這意味著不需要在foreach循環(huán)之前調(diào)用reset()。
除非數(shù)組是被引用,foreach所操作的是指定數(shù)組的一個(gè)備份,而不是該數(shù)組本身。foreach對(duì)數(shù)組指針有些副作用。除非對(duì)其重置,在foreach循環(huán)中或循環(huán)后都不要依賴數(shù)組指針的值。但是從PHP 5開始,可以很容易地通過(guò)在$value之前加上&運(yùn)算符來(lái)修改數(shù)組的元素。此方法將以引用賦值而不是復(fù)制一個(gè)值。如:
<?php$arr = array(1, 2, 3, 4);foreach ($arr as &$value) { $value = $value * 2;}?>
則執(zhí)行完畢,數(shù)組$arr的值變成array(2, 4, 6,8)。