PHP流程控制(2)

while循環(huán)語句

while循環(huán)是PHP中最簡單的循環(huán)類型。其基本格式如下:while (expr)     statement

while語句的含義很簡單,它告訴PHP只要while表達式的值為TRUE,就重復(fù)執(zhí)行嵌套中的循環(huán)語句。表達式的值在每次開始循環(huán)時檢查,所以即使這個值在循環(huán)語句中改變了,語句也不會停止執(zhí)行,直到本次循環(huán)結(jié)束。有時如果while表達式的值一開始就是FALSE,則循環(huán)語句一次都不會執(zhí)行。

例如,下面兩個循環(huán)語句完全一樣,都顯示數(shù)字1到10。

<?php$i = 1;while ($i <= 10) {    echo $i++;}$i = 1;while ($i <= 10) {    print $i;    $i++;}?>

do-while循環(huán)語句

do-while與while循環(huán)非常相似,區(qū)別在于表達式的值是在每次循環(huán)結(jié)束時檢查而不是在開始時,因此do-while循環(huán)語句保證會執(zhí)行一次循環(huán),而while循環(huán)就不一定了,如果表達式的值為false則整個循環(huán)立即終止。如:

<?php$i = 0;do {   echo $i;} while ($i > 0);?>

在上面示例中,循環(huán)正好運行一次,因為經(jīng)過第一次循環(huán)后,當(dāng)檢查表達式的真值時,其值為false($i不大于0)而導(dǎo)致循環(huán)終止。

for循環(huán)語句

for循環(huán)是PHP中最復(fù)雜的循環(huán)結(jié)構(gòu)。它的行為與C語言的相似。其語法格式如下:

for (expr1; expr2; expr3)      statement

第一個表達式(expr1)在循環(huán)開始前無條件求值一次。第二個表達式expr2在每次循環(huán)開始前求值。如果值為true,則繼續(xù)循環(huán),執(zhí)行嵌套的循環(huán)語句。如果值為false,則終止循環(huán)。第三個表達式expr3在每次循環(huán)之后被求值(執(zhí)行)。每個表達式都可以為空或包括逗號分隔的多個表達式。表達式expr2中,所有用逗號分隔的表達式都會計算,但只取最后一個結(jié)果。expr2為空,PHP會認為其值為true,意味著將無限循環(huán)下去。這可能不像想象中那樣沒有用,因為經(jīng)常會希望用break語句來結(jié)束循環(huán)而不是用for的表達式真值判斷。例如,下面示例中4個循環(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++);?>

在上面示例中第一個循環(huán)結(jié)構(gòu)比較常見,但是后面3種循環(huán)形式在特殊情況下比較實用,建議用戶靈活掌握它們,學(xué)會在for循環(huán)中使用空的表達式有時會發(fā)現(xiàn)很方便。for循環(huán)經(jīng)常用在遍歷操作,例如,在下面示例中對數(shù)組進行遍歷,以便改變數(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的第二個表達式需要獲取數(shù)組的長度,因此每次循環(huán)時都要計算一遍數(shù)組的長度,這樣就影響到循環(huán)的執(zhí)行效率。由于數(shù)組的長度始終不變,可以使用一個中間變量來存儲數(shù)組長度,然后用這個變量作為for循環(huán)的第二個表達式。這樣在循環(huán)時就可以直接使用該變量的值,不用每次重新計算。如:

<?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)語句

PHP 4引入了foreach結(jié)構(gòu),該結(jié)構(gòu)僅能用于數(shù)組,當(dāng)試圖將其用于其他數(shù)據(jù)類型或者一個未初始化的變量時會產(chǎn)生錯誤,因此可以把它視為一種遍歷數(shù)組的簡便方法。foreach結(jié)構(gòu)有兩種語法:

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án)格式相同,只是它不僅獲取每個單元的值,還可以獲取單元的鍵名,其中當(dāng)前單元的鍵名也會在每次循環(huán)中被賦給變量$key。雖然這種格式不常用,但它是第一種格式的有益擴展。自PHP 5起,foreach結(jié)構(gòu)還可以遍歷對象。

當(dāng)foreach開始執(zhí)行時,數(shù)組內(nèi)部的指針會自動指向第一個單元。這意味著不需要在foreach循環(huán)之前調(diào)用reset()。

除非數(shù)組是被引用,foreach所操作的是指定數(shù)組的一個備份,而不是該數(shù)組本身。foreach對數(shù)組指針有些副作用。除非對其重置,在foreach循環(huán)中或循環(huán)后都不要依賴數(shù)組指針的值。但是從PHP 5開始,可以很容易地通過在$value之前加上&運算符來修改數(shù)組的元素。此方法將以引用賦值而不是復(fù)制一個值。如:

<?php$arr = array(1, 2, 3, 4);foreach ($arr as &$value) {    $value = $value * 2;}?>

則執(zhí)行完畢,數(shù)組$arr的值變成array(2, 4, 6,8)。


網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷咨詢專線:0871-63535511(點擊可一鍵撥號)