PHP for 迴圈

for 迴圈適合在已知執行次數的情況下使用。它將初始化、條件判斷和更新放在同一行,使程式碼更簡潔。

for 語法

for (初始化; 條件; 更新) {
    // 程式碼
}
  • 初始化:在迴圈開始前執行一次
  • 條件:每次迭代前檢查,為 true 時執行迴圈
  • 更新:每次迭代後執行
<?php
for ($i = 1; $i <= 5; $i++) {
    echo "第 $i 次\n";
}
?>

輸出:

第 1 次
第 2 次
第 3 次
第 4 次
第 5 次

執行流程

  1. 執行初始化(只執行一次)
  2. 檢查條件
  3. 如果為 true,執行程式碼區塊
  4. 執行更新
  5. 回到步驟 2
  6. 如果為 false,跳出迴圈
<?php
for ($i = 0; $i < 3; $i++) {
    echo "i = $i\n";
}
echo "迴圈結束,i = $i";
?>

輸出:

i = 0
i = 1
i = 2
迴圈結束,i = 3

遞減迴圈

<?php
// 從 5 倒數到 1
for ($i = 5; $i >= 1; $i--) {
    echo "$i ";
}
// 輸出:5 4 3 2 1
?>

不同的遞增方式

<?php
// 每次加 2
for ($i = 0; $i <= 10; $i += 2) {
    echo "$i ";
}
// 輸出:0 2 4 6 8 10

// 每次乘 2
for ($i = 1; $i <= 100; $i *= 2) {
    echo "$i ";
}
// 輸出:1 2 4 8 16 32 64
?>

多個變數

可以在 for 迴圈中使用多個變數:

<?php
for ($i = 0, $j = 10; $i < $j; $i++, $j--) {
    echo "i = $i, j = $j\n";
}
?>

輸出:

i = 0, j = 10
i = 1, j = 9
i = 2, j = 8
i = 3, j = 7
i = 4, j = 6

省略部分

for 迴圈的三個部分都可以省略:

<?php
// 省略初始化
$i = 0;
for (; $i < 3; $i++) {
    echo $i;
}

// 省略更新
for ($i = 0; $i < 3; ) {
    echo $i;
    $i++;
}

// 省略所有(無限迴圈)
for (;;) {
    echo "無限迴圈\n";
    break;  // 記得要有跳出條件
}
?>

遍歷陣列

<?php
$fruits = ['蘋果', '香蕉', '橘子'];

// 使用索引遍歷
for ($i = 0; $i < count($fruits); $i++) {
    echo "$i: $fruits[$i]\n";
}
?>

輸出:

0: 蘋果
1: 香蕉
2: 橘子
遍歷陣列時,使用 foreach 通常更方便,請參考 foreach 迴圈

效能優化

避免在條件中重複呼叫函數:

<?php
$items = range(1, 1000);

// 不好:每次都呼叫 count()
for ($i = 0; $i < count($items); $i++) {
    // ...
}

// 好:先儲存長度
$length = count($items);
for ($i = 0; $i < $length; $i++) {
    // ...
}

// 或者在初始化時儲存
for ($i = 0, $len = count($items); $i < $len; $i++) {
    // ...
}
?>

break 語句

break 用於立即跳出迴圈:

<?php
for ($i = 1; $i <= 10; $i++) {
    if ($i === 5) {
        echo "到 5 了,跳出迴圈\n";
        break;
    }
    echo "i = $i\n";
}
// 只會輸出 1 到 4
?>

continue 語句

continue 用於跳過當前迭代,繼續下一次:

<?php
for ($i = 1; $i <= 10; $i++) {
    // 跳過偶數
    if ($i % 2 === 0) {
        continue;
    }
    echo "$i ";
}
// 輸出:1 3 5 7 9
?>

巢狀迴圈

迴圈可以巢狀使用:

<?php
// 九九乘法表
for ($i = 1; $i <= 9; $i++) {
    for ($j = 1; $j <= 9; $j++) {
        $result = $i * $j;
        echo "$i × $j = $result\t";
    }
    echo "\n";
}
?>

跳出多層迴圈

使用 break n 跳出指定層數的迴圈:

<?php
for ($i = 1; $i <= 3; $i++) {
    for ($j = 1; $j <= 3; $j++) {
        echo "($i, $j) ";
        if ($i === 2 && $j === 2) {
            echo "\n找到目標,跳出所有迴圈\n";
            break 2;  // 跳出 2 層迴圈
        }
    }
    echo "\n";
}
?>

替代語法

在 HTML 模板中使用替代語法:

<?php $items = ['蘋果', '香蕉', '橘子']; ?>

<ul>
<?php for ($i = 0; $i < count($items); $i++): ?>
    <li><?= $items[$i] ?></li>
<?php endfor; ?>
</ul>

實際應用範例

生成 HTML 表格

<?php
$data = [
    ['名稱' => 'Alice', '年齡' => 25, '城市' => '台北'],
    ['名稱' => 'Bob', '年齡' => 30, '城市' => '台中'],
    ['名稱' => 'Charlie', '年齡' => 35, '城市' => '高雄'],
];
?>
<table border="1">
    <tr>
        <th>#</th>
        <th>名稱</th>
        <th>年齡</th>
        <th>城市</th>
    </tr>
    <?php for ($i = 0; $i < count($data); $i++): ?>
    <tr>
        <td><?= $i + 1 ?></td>
        <td><?= $data[$i]['名稱'] ?></td>
        <td><?= $data[$i]['年齡'] ?></td>
        <td><?= $data[$i]['城市'] ?></td>
    </tr>
    <?php endfor; ?>
</table>

分頁

<?php
$totalItems = 95;
$itemsPerPage = 10;
$currentPage = 3;

$totalPages = ceil($totalItems / $itemsPerPage);

echo "<nav>\n";
for ($page = 1; $page <= $totalPages; $page++) {
    if ($page === $currentPage) {
        echo "  <span>[$page]</span>\n";
    } else {
        echo "  <a href='?page=$page'>$page</a>\n";
    }
}
echo "</nav>\n";
?>

生成星星評分

<?php
function renderStars(int $rating, int $maxStars = 5): string {
    $html = '';

    for ($i = 1; $i <= $maxStars; $i++) {
        if ($i <= $rating) {
            $html .= '★';  // 實心星星
        } else {
            $html .= '☆';  // 空心星星
        }
    }

    return $html;
}

echo renderStars(3);  // ★★★☆☆
echo renderStars(5);  // ★★★★★
echo renderStars(0);  // ☆☆☆☆☆
?>

質數判斷

<?php
function isPrime(int $n): bool {
    if ($n < 2) {
        return false;
    }

    for ($i = 2; $i * $i <= $n; $i++) {
        if ($n % $i === 0) {
            return false;
        }
    }

    return true;
}

// 找出 1-50 之間的質數
echo "1-50 之間的質數:";
for ($i = 1; $i <= 50; $i++) {
    if (isPrime($i)) {
        echo "$i ";
    }
}
// 輸出:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
?>

氣泡排序

<?php
function bubbleSort(array $arr): array {
    $n = count($arr);

    for ($i = 0; $i < $n - 1; $i++) {
        for ($j = 0; $j < $n - $i - 1; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                // 交換
                $temp = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $temp;
            }
        }
    }

    return $arr;
}

$numbers = [64, 34, 25, 12, 22, 11, 90];
$sorted = bubbleSort($numbers);

print_r($sorted);
// [11, 12, 22, 25, 34, 64, 90]
?>

繪製圖形

<?php
// 三角形
$rows = 5;

for ($i = 1; $i <= $rows; $i++) {
    // 印出空格
    for ($j = 1; $j <= $rows - $i; $j++) {
        echo " ";
    }
    // 印出星號
    for ($k = 1; $k <= 2 * $i - 1; $k++) {
        echo "*";
    }
    echo "\n";
}
?>

輸出:

    *
   ***
  *****
 *******
*********