萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 迴圈控制語句全解析:for、foreach、while、do-while

foreach:陣列遍歷的首選語法

PHP 4 引入 foreach,專為陣列遍歷設計,語法簡潔直觀。注意:僅能用於陣列,用於其他型別或未初始化變數會報錯。

兩種語法形式

// 僅取值
foreach ($array as $value) { ... }

// 同時取鍵與值
foreach ($array as $key => $value) { ... }

重要特性

  • 執行時自動將陣列指標指向第一個元素,無需呼叫 reset()。
  • 操作的是陣列副本,原陣列指標與內容不受影響。
  • 不支援 @ 抑制錯誤訊息。

與 while+each 等價對照

<?php
$arr = ["one", "two", "three"];

// 僅取值:等價寫法
reset($arr);
while (list(, $value) = each($arr)) {
    echo "value: $value<br>\n";
}
foreach ($arr as $value) {
    echo "value: $value<br>\n";
}

// 取鍵值:等價寫法
reset($arr);
while (list($key, $value) = each($arr)) {
    echo "key: $key; value: $value<br>\n";
}
foreach ($arr as $key => $value) {
    echo "key: $key; value: $value<br>\n";
}
?>

多維陣列與動態陣列範例

<?php
// 多維陣列巢狀遍歷
$a[0][0] = "a"; $a[0][1] = "b";
$a[1][0] = "y"; $a[1][1] = "z";
foreach ($a as $v1) {
    foreach ($v1 as $v2) {
        echo "$v2\n";
    }
}

// 直接遍歷動態建立的陣列
foreach (array(1, 2, 3, 4, 5) as $v) {
    echo "$v\n";
}
?>

for:最靈活的計數迴圈

語法:for (expr1; expr2; expr3) statement

  • expr1:迴圈開始前執行一次(初始化)。
  • expr2:每次迴圈前判斷,true 繼續,false 結束。留空視為無限迴圈。
  • expr3:每次迴圈結束後執行(通常用於遞增計數器)。

四種寫法輸出 1~10

<?php
// 1. 標準寫法
for ($i = 1; $i <= 10; $i++) { print $i; }

// 2. 條件判斷在迴圈內
for ($i = 1; ; $i++) {
    if ($i > 10) break;
    print $i;
}

// 3. 初始化與遞增移至迴圈外
$i = 1;
for (;;) {
    if ($i > 10) break;
    print $i;
    $i++;
}

// 4. 將輸出與遞增放在 expr3
for ($i = 1; $i <= 10; print $i, $i++);
?>

替代語法(常用於模板)

for (expr1; expr2; expr3):
    statement;
    ...
endfor;

while:最基礎的條件迴圈

語法:while (expr) statement

  • 每次迴圈開始前檢查條件。
  • 條件初始為 false 時,迴圈一次也不執行。

標準與替代語法

<?php
// 標準寫法
$i = 1;
while ($i <= 10) { print $i++; }

// 替代語法
$i = 1;
while ($i <= 10):
    print $i;
    $i++;
endwhile;
?>

do-while:保證至少執行一次

語法:do { statement } while (expr);

  • 條件在迴圈結束後檢查,因此迴圈體至少執行一次。
  • 常見技巧:do { ... } while(0); 配合 break 實現類似 goto 的結構化錯誤處理。

範例:僅執行一次

<?php
$i = 0;
do {
    print $i;
} while ($i > 0); // 第一次結束後 $i=0,條件為 false,結束
?>

範例:結構化錯誤處理模式

<?php
do {
    if ($i < 5) {
        print "i is not big enough";
        break;
    }
    $i *= $factor;
    if ($i < $minimum_limit) {
        break;
    }
    print "i is ok";
    /* process i */
} while(0);
?>

選擇指南

迴圈類型適用場景
foreach遍歷陣列、物件屬性(首選)
for已知迴圈次數、需精確控制計數器
while未知迴圈次數、依條件決定是否進入
do-while至少需執行一次、資源釋放/錯誤處理模式
copyright © 萬盛學電腦網 all rights reserved