PHP 流程控制

流程控制语句决定了程序的执行路径,是编程逻辑的骨架。PHP 提供了完整的流程控制结构,包括条件判断和循环两大类。合理使用流程控制,可以让程序根据不同的数据和条件做出不同的响应。

条件判断:if / elseif / else

if 语句是最基本的条件判断结构,根据条件的真假决定执行哪段代码:

PHP 实例
$score = 85;

if ($score >= 90) { echo "优秀"; } elseif ($score >= 80) { echo "良好"; } elseif ($score >= 60) { echo "及格"; } else { echo "不及格"; } // 输出:良好 ``

当条件体只有一行代码时,可以省略花括号,但为了代码可读性,建议始终保留花括号:

`php // 不推荐(容易出错) if ($isAdmin) echo "管理员";

// 推荐 if ($isAdmin) { echo "管理员"; } `

match 表达式(PHP 8.0+)

match 是 PHP 8 引入的现代条件表达式,比 if-elseif 更简洁,使用严格比较(===):

`php $status = 2;

$label = match($status) { 1 => '待支付', 2, 3 => '处理中', // 多个条件共用一个结果 4 => '已完成', default => '未知状态', };

echo $label; // 处理中 `

条件判断:switch

switch 适合对同一个变量进行多值比较,比多个 if-elseif 更清晰:

`php $day = "Monday";

switch ($day) { case "Monday": case "Tuesday": case "Wednesday": case "Thursday": case "Friday": echo "工作日"; break; case "Saturday": case "Sunday": echo "周末"; break; default: echo "无效日期"; } `

注意 switch 使用的是松散比较(==),而 match 使用严格比较(===)。每个 case 末尾必须有 break,否则会继续执行下一个 case(称为"贯穿")。

for 循环

for 循环适合已知循环次数的场景:

`php // 基本用法 for ($i = 0; $i < 5; $i++) { echo $i . " "; // 0 1 2 3 4 }

// 倒序循环 for ($i = 10; $i > 0; $i -= 2) { echo $i . " "; // 10 8 6 4 2 }

// 生成 HTML 表格行 for ($row = 1; $row <= 3; $row++) { echo "<tr>"; for ($col = 1; $col <= 3; $col++) { echo "<td>$row-$col</td>"; } echo "</tr>"; } `

while 循环

while 循环在条件为真时持续执行,适合不确定循环次数的场景:

`php $i = 0; while ($i < 5) { echo $i++; } // 输出:01234

// 读取文件直到末尾 $handle = fopen('data.txt', 'r'); while (!feof($handle)) { $line = fgets($handle); echo $line; } fclose($handle); `

do-while 循环

do-while 至少执行一次循环体,然后再检查条件:

`php $i = 10; do { echo $i; // 即使条件一开始就为 false,也会执行一次 $i++; } while ($i < 5); // 输出:10

// 实际应用:菜单选择 do { $choice = getUserInput(); } while ($choice < 1 || $choice > 5); // 直到输入有效值 `

foreach 循环

foreach 专为数组和对象设计,是遍历数组最常用的方式:

`php // 遍历索引数组 $fruits = ["苹果", "香蕉", "橙子"]; foreach ($fruits as $fruit) { echo $fruit . "\n"; }

// 遍历关联数组(获取键和值) $user = ["name" => "张三", "age" => 25, "city" => "北京"]; foreach ($user as $key => $value) { echo "$key: $value\n"; }

// 遍历多维数组 $students = [ ["name" => "张三", "score" => 85], ["name" => "李四", "score" => 92], ]; foreach ($students as $index => $student) { echo ($index + 1) . ". {$student['name']}:{$student['score']} 分\n"; } `

引用遍历(修改数组元素)

`php $prices = [100, 200, 300];

// 使用引用修改原数组 foreach ($prices as &$price) { $price *= 0.9; // 打九折 } unset($price); // 重要!循环后必须 unset 引用,避免后续误操作

print_r($prices); // [90, 180, 270] `

break 和 continue

break 用于跳出循环,continue 用于跳过当前迭代:

`php // break:找到目标后立即退出 $numbers = [1, 3, 5, 7, 8, 9, 11]; foreach ($numbers as $num) { if ($num % 2 === 0) { echo "找到第一个偶数:$num"; break; // 找到后退出循环 } }

// continue:跳过偶数,只处理奇数 for ($i = 1; $i <= 10; $i++) { if ($i % 2 === 0) continue; echo $i . " "; // 1 3 5 7 9 }

// break 2:跳出两层嵌套循环 for ($i = 0; $i < 3; $i++) { for ($j = 0; $j < 3; $j++) { if ($i === 1 && $j === 1) break 2; echo "$i-$j "; } } `

实际应用示例

`php // 分页逻辑 $totalItems = 95; $perPage = 10; $totalPages = ceil($totalItems / $perPage);

for ($page = 1; $page <= $totalPages; $page++) { $start = ($page - 1) * $perPage + 1; $end = min($page * $perPage, $totalItems); echo "第 $page 页:第 $start - $end 条\n"; }

// 过滤并处理数据 $orders = [ ['id' => 1, 'status' => 'paid', 'amount' => 100], ['id' => 2, 'status' => 'pending', 'amount' => 200], ['id' => 3, 'status' => 'paid', 'amount' => 150], ];

$total = 0; foreach ($orders as $order) { if ($order['status'] !== 'paid') continue; $total += $order['amount']; } echo "已支付总额:$total"; // 250

常见问题

Q:for、while、foreach 该如何选择? A:已知循环次数用 for;条件驱动的循环用 while;遍历数组或对象用 foreachforeach 是 PHP 中最常用的循环,因为 PHP 大量使用数组。

Q:switch 和 if-elseif 哪个性能更好? A:对于少量条件,两者性能差异可以忽略。switch 在多条件比较同一变量时代码更清晰。PHP 8 的 match 表达式是更现代的替代方案,推荐优先使用。

Q:foreach 遍历时修改数组会有问题吗? A:直接在 foreach 中修改 $value 不会影响原数组,因为 $value 是副本。要修改原数组,需要使用引用 foreach ($arr as &$value) 或通过键名 $arr[$key] = ...。使用引用后记得 unset($value)

Q:能在 foreach 中删除数组元素吗? A:不建议在 foreach 遍历时直接删除元素,可能导致意外行为。推荐先收集要删除的键,循环结束后再删除,或使用 array_filter()` 过滤。