三:条件判断与循环——if、for、while

一、回顾与本篇目标

上一篇你学习了 PHP 的变量、数据类型、echo 输出和类型转换。你知道变量以 $ 开头,字符串用点号拼接,双引号支持变量插值。

这一篇我们要学的是控制流——让程序不再只是从上到下直线执行,而是能根据条件选择不同的路径,以及重复执行某段代码。这两个能力加在一起,你的程序就能处理几乎所有的逻辑了。

如果你已经学过 C 语言或 JavaScript,这一篇你会觉得非常熟悉——PHP 的条件判断和循环语法,和它们几乎一模一样。PHP 从 C 语言继承了整套控制流语法,又加入了一些专为 Web 模板设计的替代写法。

本篇的目标:

  1. 掌握 if/elseif/else 条件判断
  2. 学会 PHP 在 HTML 中的替代语法
  3. 掌握 for 循环和 while 循环
  4. 学会 foreach 循环遍历数组
  5. 掌握 breakcontinue 的用法
  6. 理解 switch 多分支选择

二、条件判断:if/elseif/else

PHP 的条件判断和 C 语言、JavaScript 的语法几乎完全相同——条件用括号包裹,代码块用花括号。

基本结构

if (条件) {
    // 条件成立时执行
} elseif (另一个条件) {
    // 第一个条件不成立,但第二个条件成立时执行
} else {
    // 所有条件都不成立时执行
}

和 C/JS/Python 的对比

特性 C JavaScript Python PHP
条件包裹 ( ) ( ) 不需要括号 ( )
代码块 { } { } 缩进 + 冒号 { }
多分支 else if else if elif elseifelse if

PHP 中 elseifelse if 都可以用,两者完全等价。elseif(连在一起)是 PHP 特有的写法,更推荐。

完整示例:成绩判断

<?php
$score = 85;

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

PHP 中”真”和”假”的定义

上一篇我们提到了 PHP 的 Falsy 值。这里再强化一下:

// 以下值在条件判断中都被视为 false
if (false)   { }    // false 本身
if (0)       { }    // 整数 0
if (0.0)     { }    // 浮点数 0.0
if ("")      { }    // 空字符串
if ("0")     { }    // 字符串 "0" —— 注意!这个是 PHP 特有的
if ([])      { }    // 空数组
if (null)    { }    // NULL

// 其他所有值都是 true
if (true)    { }    // true 本身
if (1)       { }    // 非零整数
if (-1)      { }    // 负数也是 true
if ("hello") { }    // 非空字符串
if ("00")    { }    // 字符串 "00" 是 true(和 "0" 不同!)
if ([1, 2])  { }    // 非空数组

"0" 是 falsy 这一点,经常被当作 PHP 面试题。它的逻辑是:字符串 "0" 在数值上下文中会被转换成整数 0,而 0 是 falsy。

三元运算符

PHP 的三元运算符和 C/JS 完全一样:

$age = 20;
$status = ($age >= 18) ? "成年" : "未成年";
echo $status;  // 成年

PHP 还支持简写三元运算符(PHP 5.3+):

$username = $input ?: "默认用户名";
// 等价于
$username = $input ? $input : "默认用户名";
// 如果 $input 是 truthy,就用 $input;否则用默认值

NULL 合并运算符(PHP 7+):

$name = $_GET['name'] ?? '未提供';
// 等价于
$name = isset($_GET['name']) ? $_GET['name'] : '未提供';
// 区别:?? 只在变量未定义或为 NULL 时使用默认值

这是处理用户输入和表单数据时非常常用的写法。

三、PHP 在 HTML 中的替代语法

如果你要在 HTML 中嵌入 PHP 的条件判断和循环,用花括号 {} 会让代码显得很乱——括号嵌套括号,很难看清结构。PHP 提供了一套替代语法,专门为 Web 模板设计。

标准语法 替代语法
if (...) { if (...):
} elseif (...) { elseif (...):
} else { else:
} endif;

标准语法(适合纯 PHP 文件):

<?php
if ($logged_in) {
    echo "<p>欢迎回来!</p>";
} else {
    echo "<p>请先登录</p>";
}
?>

替代语法(适合 HTML 中嵌入 PHP):

<?php if ($logged_in): ?>
    <p>欢迎回来!</p>
<?php else: ?>
    <p>请先登录</p>
<?php endif; ?>

在替代语法中,HTML 代码在 if:else: 之间,不需要用 echo 输出——直接写 HTML 就行。这让模板文件(如 WordPress 主题)中的逻辑判断非常清晰。

同样,循环也有替代语法:

<ul>
<?php foreach ($users as $user): ?>
    <li><?= $user['name'] ?></li>
<?php endforeach; ?>
</ul>

四、for 循环

PHP 的 for 循环和 C 语言、JavaScript 完全一样——三要素(初始化、条件、更新)用分号分隔。

基本语法

for (初始化; 条件; 更新) {
    // 循环体
}

完整示例

<?php
// 打印 1 到 5
for ($i = 1; $i <= 5; $i++) {
    echo "第 {$i} 次循环<br>";
}

// 循环变量可以是从 0 开始的
for ($j = 0; $j < 10; $j++) {
    echo $j . " ";
}
// 输出:0 1 2 3 4 5 6 7 8 9
?>

和 Python 的区别

如果你学过 Python,要特别注意:PHP 的 for 是”计数循环”(手动控制初始值、终止条件、步长),不是”遍历循环”。Python 的 for 遍历的是可迭代对象,PHP 对应的功能是 foreach

for 循环的变体

<?php
// 初始化放在外面
$i = 0;
for (; $i < 5; $i++) {
    echo $i;
}

// 更新放在循环体里
for ($i = 0; $i < 5;) {
    echo $i;
    $i++;
}

// 无限循环(三个部分全省略)
for (;;) {
    echo "无限循环";
    break;  // 用 break 退出
}
?>

五、while 循环和 do…while 循环

while 循环

while 循环的逻辑是:先判断条件,条件成立则执行循环体,然后再次判断条件,直到条件不成立。

<?php
$count = 1;

while ($count <= 5) {
    echo "第 {$count} 次循环<br>";
    $count++;
}

echo "循环结束,count = {$count}";  // count = 6
?>

while 和 for 怎么选?

  • 知道循环次数(比如遍历数组、执行 N 次)→ 用 for
  • 不知道循环次数(比如让用户一直输入直到输入正确、读数据库直到没有数据)→ 用 while

do…while 循环

do...whilewhile 的唯一区别是:do…while 先执行一次循环体,再判断条件。 这意味着循环体至少会被执行一次

<?php
$number = 1;

do {
    echo "当前数字:{$number}<br>";
    $number++;
} while ($number <= 5);
?>

即使初始条件不成立,循环体也会执行一次:

<?php
$number = 10;

do {
    echo "至少会执行一次";  // 这行会输出
} while ($number <= 5);      // 条件不成立,循环结束
?>

六、foreach:遍历数组的利器

foreach 是 PHP 中专门用来遍历数组的循环。它是 PHP 中最常用的循环类型——因为 Web 开发中大量时间都在处理数组数据。

遍历数组的值

<?php
$fruits = ["苹果", "香蕉", "橘子"];

foreach ($fruits as $fruit) {
    echo $fruit . "<br>";
}
// 苹果
// 香蕉
// 橘子
?>

同时获取键和值

<?php
$user = [
    "name" => "张三",
    "age" => 28,
    "city" => "上海"
];

foreach ($user as $key => $value) {
    echo "{$key}: {$value}<br>";
}
// name: 张三
// age: 28
// city: 上海
?>

foreach 和 for 的对比

foreach 专门用于遍历数组,不需要手动管理索引。Python 的 for item in list 和 JavaScript 的 for...offor...in 功能与之类似。

七、break 和 continue

break:立即退出整个循环

<?php
// 找到第一个能被 7 整除的数就停止
for ($i = 1; $i <= 50; $i++) {
    if ($i % 7 == 0) {
        echo "找到了:{$i}";
        break;  // 退出循环,后面的 8 到 50 都不会执行
    }
}
// 输出:找到了:7
?>

break 可以接受一个数字参数,用于跳出多层循环:

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

continue:跳过本轮循环,继续下一轮

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

continue 也可以接受数字参数,用于跳过外层循环的当前迭代。

八、switch:多分支选择

当需要根据一个变量的不同值来执行不同代码时,用 switch 比写一长串 if...elseif 更清晰。

<?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;
    case 6:
    case 7:
        echo "周末!";
        break;
    default:
        echo "无效的日期";
        break;
}
// 输出:星期三
?>

和 C 语言一样,每个 case 后面需要 break,否则会”穿透”到下一个 case。case 6 和 case 7 共享同一个处理逻辑,就是利用了这种”穿透”特性。

九、综合演示:猜数字游戏

下面这段代码综合运用了条件判断、循环和用户输入:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>猜数字游戏</title>
    <style>
        body { font-family: sans-serif; padding: 40px; background: #f0f4f8; text-align: center; }
        .game-box { background: white; padding: 30px; border-radius: 12px; max-width: 400px; margin: 0 auto; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        .message { margin: 20px 0; font-size: 18px; }
        input { padding: 10px; font-size: 16px; width: 100px; text-align: center; }
        button { padding: 10px 20px; font-size: 16px; background: #4a90d9; color: white; border: none; border-radius: 6px; cursor: pointer; }
    </style>
</head>
<body>

<div class="game-box">
    <h2>🎯 猜数字游戏</h2>
    <p>我想了一个 1 到 100 之间的数字,你猜猜看?</p>

    <?php
    // 生成随机数(如果还没生成)
    session_start();
    if (!isset($_SESSION['secret'])) {
        $_SESSION['secret'] = rand(1, 100);
        $_SESSION['attempts'] = 0;
    }

    $secret = $_SESSION['secret'];
    $message = "";

    // 处理用户猜测
    if (isset($_GET['guess'])) {
        $guess = (int)$_GET['guess'];
        $_SESSION['attempts']++;

        if ($guess > $secret) {
            $message = "📈 太大了,再小一点";
        } elseif ($guess < $secret) {
            $message = "📉 太小了,再大一点";
        } else {
            $message = "🎉 恭喜你!答案就是 {$secret}!你一共猜了 {$_SESSION['attempts']} 次。";
            // 重置游戏
            unset($_SESSION['secret']);
            unset($_SESSION['attempts']);
        }
    }
    ?>

    <?php if ($message): ?>
        <div class="message"><?= $message ?></div>
    <?php endif; ?>

    <form method="GET">
        <input type="number" name="guess" min="1" max="100" placeholder="1-100" required>
        <br><br>
        <button type="submit">猜!</button>
    </form>
</div>

</body>
</html>

代码解析:

  • session_start() 开启会话,$_SESSION 用来跨请求存储数据(后面会详细讲)。这里用 Session 存储随机数和猜测次数,刷新页面不会丢失。
  • rand(1, 100) 生成 1 到 100 的随机整数。
  • isset($_GET['guess']) 判断用户是否提交了猜测。
  • 条件判断 if ($guess > $secret) 给出”太大”或”太小”的提示。
  • 猜对后 unset() 销毁 Session 中的游戏数据,重新开始。

这个猜数字游戏是一个完整的、带用户交互的 PHP 程序。你可以把它保存为 guess.php,用 php -S localhost:8080 启动服务器,在浏览器中玩。

十、本篇动手练习

练习 1:判断闰年

新建 practice3-1.php。闰年规则:能被 4 整除但不能被 100 整除,或者能被 400 整除。用 if/else 判断一个年份是否是闰年。测试几个年份:2000(是)、2023(不是)、2024(是)、1900(不是)。

练习 2:乘法口诀表

新建 practice3-2.php,用嵌套 for 循环输出 9×9 乘法口诀表,用 HTML 表格渲染。

练习 3:遍历数组

新建 practice3-3.php,创建以下关联数组:

$students = [
    ["name" => "张三", "score" => 85],
    ["name" => "李四", "score" => 92],
    ["name" => "王五", "score" => 78],
    ["name" => "赵六", "score" => 95],
    ["name" => "孙七", "score" => 60],
];

foreach 遍历,输出每个学生的姓名、成绩和等级(>=90 优秀,>=80 良好,>=60 及格,<60 不及格)。

练习 4:数字反转

新建 practice3-4.php,用 while 循环把一个整数反转输出。例如输入 12345,输出 54321。提示:每次用取余拿到最后一位,累加到结果变量上,原数除以 10(整除)。

十一、本篇小结

这一篇你学会了 PHP 的控制流:

  • if/elseif/else:和 C/JS 语法几乎一样。PHP 可以用 elseif(连写)。记住 "0" 是 falsy。
  • 三元运算符和 NULL 合并运算符?:?? 是处理默认值的高频写法。
  • 替代语法:在 HTML 模板中用 if(): ... endif; 代替花括号,代码更清晰。
  • for 循环:和 C/JS 完全一样,三要素用分号分隔。
  • whiledo...while:先判断 vs 先执行。
  • foreach:PHP 最常用的循环,专门遍历数组。可以只取值,也可以同时取键和值。
  • breakcontinuebreak 退出整个循环,continue 跳过本轮。都支持数字参数跳出多层。
  • switch/case:多分支选择,记得写 break

下一篇,我们学习 PHP 中最强大的数据结构——数组。PHP 的数组同时兼任了列表和字典两种角色,还内置了排序、过滤、合并等数十个实用函数。

下一篇预告

下一篇——《PHP 数组——最强大的数据结构》:索引数组和关联数组、多维数组、数组的增删改查、foreach 深入、常用数组函数(排序、过滤、映射、合并、去重)。这是 PHP 开发中最核心的技能。

PHP 零基础入门,每周更新。

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容