<返回目录     Powered by claud/xia兄

第4课: 控制结构与循环

条件语句 - if

if语句用于根据条件执行不同的代码块。

基本if语句

<?php
$age = 18;

if ($age >= 18) {
    echo "您已成年,可以投票";
}

// 单行if语句(不推荐)
if ($age >= 18) echo "成年人";
?>

if-else语句

<?php
$score = 75;

if ($score >= 60) {
    echo "及格";
} else {
    echo "不及格";
}

// 实际应用:用户权限检查
$isAdmin = true;
if ($isAdmin) {
    echo "欢迎,管理员";
} else {
    echo "欢迎,普通用户";
}
?>

if-elseif-else语句

<?php
$score = 85;

if ($score >= 90) {
    $grade = "A";
} elseif ($score >= 80) {
    $grade = "B";
} elseif ($score >= 70) {
    $grade = "C";
} elseif ($score >= 60) {
    $grade = "D";
} else {
    $grade = "F";
}

echo "成绩等级: $grade";
?>

嵌套if语句

<?php
$age = 25;
$hasLicense = true;

if ($age >= 18) {
    if ($hasLicense) {
        echo "可以驾驶";
    } else {
        echo "需要先考驾照";
    }
} else {
    echo "年龄不够,不能驾驶";
}

// 使用逻辑运算符简化
if ($age >= 18 && $hasLicense) {
    echo "可以驾驶";
}
?>

switch语句

switch语句用于基于不同值执行不同代码,比多个if-elseif更清晰。

基本switch语句

<?php
$day = "Monday";

switch ($day) {
    case "Monday":
        echo "星期一";
        break;
    case "Tuesday":
        echo "星期二";
        break;
    case "Wednesday":
        echo "星期三";
        break;
    case "Thursday":
        echo "星期四";
        break;
    case "Friday":
        echo "星期五";
        break;
    case "Saturday":
    case "Sunday":
        echo "周末";
        break;
    default:
        echo "无效的日期";
}
?>

switch穿透(fall-through)

<?php
$month = 2;

switch ($month) {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        $days = 31;
        break;
    case 4:
    case 6:
    case 9:
    case 11:
        $days = 30;
        break;
    case 2:
        $days = 28;
        break;
    default:
        $days = 0;
}

echo "这个月有 $days 天";
?>

switch与match表达式(PHP 8+)

<?php
// 传统switch
$status = 200;
switch ($status) {
    case 200:
        $message = "成功";
        break;
    case 404:
        $message = "未找到";
        break;
    default:
        $message = "未知";
}

// PHP 8+ match表达式(更简洁)
$message = match ($status) {
    200 => "成功",
    404 => "未找到",
    500 => "服务器错误",
    default => "未知状态"
};
?>

for循环

for循环用于已知循环次数的情况。

基本for循环

<?php
// 打印1到10
for ($i = 1; $i <= 10; $i++) {
    echo $i . " ";
}

// 倒序循环
for ($i = 10; $i >= 1; $i--) {
    echo $i . " ";
}

// 步长为2
for ($i = 0; $i <= 20; $i += 2) {
    echo $i . " ";  // 0 2 4 6 8 10...
}
?>

嵌套for循环

<?php
// 打印乘法表
for ($i = 1; $i <= 9; $i++) {
    for ($j = 1; $j <= $i; $j++) {
        echo "$j x $i = " . ($i * $j) . "\t";
    }
    echo "\n";
}

// 打印矩阵
for ($row = 1; $row <= 5; $row++) {
    for ($col = 1; $col <= 5; $col++) {
        echo "* ";
    }
    echo "\n";
}
?>

while循环

while循环在条件为真时重复执行代码块。

基本while循环

<?php
$count = 1;
while ($count <= 5) {
    echo "计数: $count\n";
    $count++;
}

// 读取文件示例
$file = fopen("data.txt", "r");
while (!feof($file)) {
    $line = fgets($file);
    echo $line;
}
fclose($file);
?>

do-while循环

<?php
// do-while至少执行一次
$num = 0;
do {
    echo "数字: $num\n";
    $num++;
} while ($num < 5);

// 实际应用:菜单系统
do {
    echo "1. 选项1\n";
    echo "2. 选项2\n";
    echo "0. 退出\n";
    $choice = readline("请选择: ");

    switch ($choice) {
        case "1":
            echo "执行选项1\n";
            break;
        case "2":
            echo "执行选项2\n";
            break;
    }
} while ($choice != "0");
?>

foreach循环

foreach专门用于遍历数组,是最常用的数组循环方式。

遍历索引数组

<?php
$colors = ["红色", "绿色", "蓝色", "黄色"];

foreach ($colors as $color) {
    echo $color . "\n";
}

// 获取索引和值
foreach ($colors as $index => $color) {
    echo "索引 $index: $color\n";
}
?>

遍历关联数组

<?php
$person = [
    "name" => "张三",
    "age" => 25,
    "city" => "北京",
    "email" => "zhang@example.com"
];

foreach ($person as $key => $value) {
    echo "$key: $value\n";
}

// 实际应用:生成HTML表格
echo "<table>";
foreach ($person as $key => $value) {
    echo "<tr><td>$key</td><td>$value</td></tr>";
}
echo "</table>";
?>

遍历多维数组

<?php
$users = [
    ["name" => "张三", "age" => 25],
    ["name" => "李四", "age" => 30],
    ["name" => "王五", "age" => 28]
];

foreach ($users as $user) {
    echo "姓名: {$user['name']}, 年龄: {$user['age']}\n";
}

// 嵌套foreach
$classes = [
    "一班" => ["张三", "李四"],
    "二班" => ["王五", "赵六"]
];

foreach ($classes as $className => $students) {
    echo "$className:\n";
    foreach ($students as $student) {
        echo "  - $student\n";
    }
}
?>

循环控制语句

break - 跳出循环

<?php
// 找到第一个偶数就停止
for ($i = 1; $i <= 10; $i++) {
    if ($i % 2 == 0) {
        echo "找到第一个偶数: $i";
        break;
    }
}

// 跳出多层循环
for ($i = 1; $i <= 3; $i++) {
    for ($j = 1; $j <= 3; $j++) {
        if ($i == 2 && $j == 2) {
            break 2;  // 跳出两层循环
        }
        echo "($i, $j) ";
    }
}
?>

continue - 跳过当前迭代

<?php
// 只打印奇数
for ($i = 1; $i <= 10; $i++) {
    if ($i % 2 == 0) {
        continue;  // 跳过偶数
    }
    echo $i . " ";
}

// 跳过空值
$data = ["张三", "", "李四", null, "王五"];
foreach ($data as $item) {
    if (empty($item)) {
        continue;
    }
    echo $item . "\n";
}
?>

替代语法

PHP提供了用于模板的替代语法,在HTML中更清晰。

<?php $items = ["苹果", "香蕉", "橙子"]; ?>

<ul>
    <?php foreach ($items as $item): ?>
        <li><?php echo $item; ?></li>
    <?php endforeach; ?>
</ul>

<?php if ($isLoggedIn): ?>
    <p>欢迎回来!</p>
<?php else: ?>
    <p>请登录</p>
<?php endif; ?>
最佳实践:

实践练习

  1. 成绩判断:使用if-elseif判断学生成绩等级(A-F)
  2. 星期判断:使用switch根据数字1-7输出星期几
  3. 乘法表:使用嵌套for循环打印9x9乘法表
  4. 求和:使用while循环计算1到100的和
  5. 数组遍历:使用foreach遍历学生信息数组并输出
  6. 查找元素:在数组中查找特定值,找到后使用break退出
  7. 过滤数组:使用continue跳过不符合条件的元素
  8. 菜单系统:使用do-while实现简单的命令行菜单