PHP 控制流
本章将介绍 PHP 的控制流语句,包括条件语句和循环语句。
条件语句
if 语句
if 语句用于根据条件执行代码块。
<?php
$age = 20;
if ($age >= 18) {
echo "您已成年";
}
?>
if-else 语句
<?php
$age = 15;
if ($age >= 18) {
echo "您已成年";
} else {
echo "您未成年";
}
?>
if-elseif-else 语句
<?php
$score = 85;
if ($score >= 90) {
echo "优秀";
} elseif ($score >= 80) {
echo "良好";
} elseif ($score >= 60) {
echo "及格";
} else {
echo "不及格";
}
?>
替代语法
PHP 提供了条件语句的替代语法,适合在 HTML 中使用:
<?php if ($age >= 18): ?>
<p>您已成年</p>
<?php elseif ($age >= 12): ?>
<p>您是青少年</p>
<?php else: ?>
<p>您是儿童</p>
<?php endif; ?>
switch 语句
switch 语句用于根据不同值执行不同代码块。
<?php
$day = 3;
switch ($day) {
case 1:
echo "星期一";
break;
case 2:
echo "星期二";
break;
case 3:
echo "星期三";
break;
case 4:
echo "星期四";
break;
case 5:
echo "星期五";
break;
default:
echo "周末";
}
?>
switch 使用松散比较(==),如果需要严格比较:
<?php
$value = "1";
switch (true) {
case $value === 1:
echo "整数 1";
break;
case $value === "1":
echo "字符串 '1'";
break;
default:
echo "其他值";
}
?>
match 表达式(PHP 8.0+)
match 是 PHP 8.0 引入的新特性,更简洁且使用严格比较:
<?php
$status = 200;
$message = match($status) {
200, 300 => "成功",
400, 404 => "客户端错误",
500, 502, 503 => "服务器错误",
default => "未知状态"
};
echo $message; // 输出:成功
?>
match 与 switch 的区别:
match返回值,switch不返回match使用严格比较(===),switch使用松散比较(==)match不需要break,switch需要match没有匹配会抛出异常,switch不会
循环语句
while 循环
while 循环在条件为真时重复执行代码块。
<?php
$count = 1;
while ($count <= 5) {
echo "第 $count 次\n";
$count++;
}
?>
替代语法:
<?php while ($count <= 5): ?>
<p>第 <?php echo $count; ?> 次</p>
<?php $count++; ?>
<?php endwhile; ?>
do-while 循环
do-while 循环至少执行一次,然后检查条件。
<?php
$count = 1;
do {
echo "第 $count 次\n";
$count++;
} while ($count <= 5);
?>
for 循环
for 循环适合已知循环次数的情况。
<?php
// for (初始化; 条件; 递增/递减)
for ($i = 1; $i <= 5; $i++) {
echo "第 $i 次\n";
}
?>
替代语法:
<?php for ($i = 1; $i <= 5; $i++): ?>
<p>第 <?php echo $i; ?> 次</p>
<?php endfor; ?>
foreach 循环
foreach 专门用于遍历数组。
<?php
// 遍历索引数组
$colors = ["红", "绿", "蓝"];
foreach ($colors as $color) {
echo "$color\n";
}
// 遍历关联数组
$person = [
"name" => "张三",
"age" => 25,
"city" => "北京"
];
foreach ($person as $key => $value) {
echo "$key: $value\n";
}
?>
替代语法:
<?php foreach ($colors as $color): ?>
<p>颜色:<?php echo $color; ?></p>
<?php endforeach; ?>
修改数组元素的值:
<?php
$numbers = [1, 2, 3, 4, 5];
// 使用 & 引用修改原数组
foreach ($numbers as &$num) {
$num *= 2;
}
unset($num); // 解除引用,避免后续问题
print_r($numbers); // [2, 4, 6, 8, 10]
?>
循环控制
break 语句
break 用于跳出循环。
<?php
for ($i = 1; $i <= 10; $i++) {
if ($i == 5) {
break; // 跳出循环
}
echo "$i ";
}
// 输出:1 2 3 4
?>
跳出多层循环:
<?php
for ($i = 1; $i <= 3; $i++) {
for ($j = 1; $j <= 3; $j++) {
if ($i == 2 && $j == 2) {
break 2; // 跳出两层循环
}
echo "($i, $j) ";
}
}
// 输出:(1, 1) (1, 2) (1, 3) (2, 1)
?>
continue 语句
continue 用于跳过当前迭代,继续下一次迭代。
<?php
for ($i = 1; $i <= 5; $i++) {
if ($i == 3) {
continue; // 跳过本次迭代
}
echo "$i ";
}
// 输出:1 2 4 5
?>
跳过多层循环的当前迭代:
<?php
for ($i = 1; $i <= 3; $i++) {
for ($j = 1; $j <= 3; $j++) {
if ($i == 2 && $j == 2) {
continue 2; // 跳到外层循环的下一次迭代
}
echo "($i, $j) ";
}
}
// 输出:(1, 1) (1, 2) (1, 3) (2, 1) (2, 3) (3, 1) (3, 2) (3, 3)
?>
goto 语句
goto 用于跳转到程序的指定位置(不推荐使用)。
<?php
echo "开始\n";
goto skip;
echo "这行不会执行\n";
skip:
echo "跳到这里\n";
// 输出:
// 开始
// 跳到这里
?>
实用示例
九九乘法表
<?php
for ($i = 1; $i <= 9; $i++) {
for ($j = 1; $j <= $i; $j++) {
echo "$j × $i = " . ($i * $j) . "\t";
}
echo "\n";
}
?>
查找数组中的元素
<?php
$numbers = [10, 20, 30, 40, 50];
$target = 30;
$found = false;
foreach ($numbers as $index => $num) {
if ($num == $target) {
echo "找到 $target 在索引 $index";
$found = true;
break;
}
}
if (!$found) {
echo "未找到 $target";
}
?>
过滤数组
<?php
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
$evens = [];
foreach ($numbers as $num) {
if ($num % 2 == 0) {
$evens[] = $num;
}
}
print_r($evens); // [2, 4, 6, 8, 10]
?>
表格生成
<?php
$users = [
["name" => "张三", "age" => 25, "city" => "北京"],
["name" => "李四", "age" => 30, "city" => "上海"],
["name" => "王五", "age" => 28, "city" => "广州"]
];
?>
<table border="1">
<tr>
<th>姓名</th>
<th>年龄</th>
<th>城市</th>
</tr>
<?php foreach ($users as $user): ?>
<tr>
<td><?php echo $user["name"]; ?></td>
<td><?php echo $user["age"]; ?></td>
<td><?php echo $user["city"]; ?></td>
</tr>
<?php endforeach; ?>
</table>
小结
本章我们学习了:
- 条件语句:if、if-else、if-elseif-else、switch、match
- 循环语句:while、do-while、for、foreach
- 循环控制:break、continue、goto
- 实际应用示例
下一章我们将学习函数的定义和使用。