PHP for 迴圈
for 迴圈適合在已知執行次數的情況下使用。它將初始化、條件判斷和更新放在同一行,使程式碼更簡潔。
for 語法
for (初始化; 條件; 更新) {
// 程式碼
}
- 初始化:在迴圈開始前執行一次
- 條件:每次迭代前檢查,為
true時執行迴圈 - 更新:每次迭代後執行
<?php
for ($i = 1; $i <= 5; $i++) {
echo "第 $i 次\n";
}
?>
輸出:
第 1 次
第 2 次
第 3 次
第 4 次
第 5 次
執行流程
- 執行初始化(只執行一次)
- 檢查條件
- 如果為
true,執行程式碼區塊 - 執行更新
- 回到步驟 2
- 如果為
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";
}
?>
輸出:
*
***
*****
*******
*********