← PHP Foreach循环:数组遍历的核心利器 PHP Do-While循环:确保至少执行一次的出口控制循环 →

PHP While循环:在不确定中寻找确定的执行逻辑

原创 2026-05-09 PHP 已有人查阅

循环结构是编程里避免重复代码的核心机制。前面我们讨论了for循环和foreach循环,它们分别擅长处理“已知次数”的重复和“数组遍历”。现在要说的while循环,适用的场景和它们有明显区别。

while循环的核心思想很简单:只要某个条件为真,就不断地执行一段代码,直到条件变为假才停下来。 它特别适合那种“你不知道要循环多少次,只知道什么时候该停”的情况。比如从数据库里逐行读取记录,你只知道“读到没数据为止”,但不知道具体有多少行;又比如等待用户输入有效指令,你只关心“输入是否合法”,不在乎他试多少次。

while循环也被称为入口控制循环,因为它在每次执行循环体之前,都会先检查条件。这意味着如果条件一开始就是FALSE,循环体里的代码一次都不会被执行。

基本语法结构

while循环的写法很简洁,有两种等价的语法风格。

标准语法(大括号风格):

while(条件表达式){
    // 条件为TRUE时重复执行的代码块
}

替代语法(冒号风格):

while(条件表达式):
    // 条件为TRUE时重复执行的代码块
endwhile;

第二种替代语法在纯PHP脚本里不常见,但它有一个很实用的场景:当你需要在HTML模板里嵌入PHP逻辑时while(): ... endwhile;比大括号更直观,不容易和HTML标签的花括号搞混。WordPress的模板代码里大量使用了这种风格。

本节课程知识要点

在用while循环写代码时,这几个要点会直接影响你程序的正确性和健壮性。

  • 循环体内必须要有改变条件的操作。这是while循环的第一铁律。如果你的循环体里没有让条件趋向于FALSE的代码,就会陷入无限循环,程序会卡死,直到PHP的执行超时或者你手动终止。那个让很多人上头的死循环bug,根源就在这里。

  • 先判断后执行,可能一次都不运行。和do...while循环不同,while在门口就把关。如果初始条件就不满足,循环体直接被跳过。这个特性在有些场景下是优势——你不需要额外写一个if去判断“要不要进循环”。

  • 条件表达式的复杂度要控制while的条件可以是任何返回布尔值的表达式,但为了可读性,不建议把一个复杂的业务判断全塞在while那一行。如果条件太复杂,提前计算好并赋给一个有意义的变量名,再用这个变量做条件。

  • 替代语法适合做模板。如果你做的是MVC架构里的视图层开发,while(): ... endwhile;能让你在HTML里更清晰地标记循环起止点。但纯逻辑脚本里,我个人还是习惯用大括号,视觉上更紧凑。

核心用法与实例解析

下面通过几个由浅入深的例子,把while循环的典型使用方式讲清楚。

1. 基础计数:模拟for循环的功能

虽然计数任务更推荐用for,但用while来实现一遍,能帮你理解它的工作机制。

<?php
$count = 1;
while($count <= 10) {
    echo "第 {$count} 次循环<br/>";
    $count++; // 这行非常重要,没有它循环停不下来
}
?>

运行结果是从1数到10。流程很简单:先检查$count是否小于等于10,是就执行循环体,然后$count加1,再回到条件判断,直到$count变成11,条件为假,退出。

2. 替代语法示例:同样的逻辑,不同的写法

把上面的例子用替代语法重写一遍,体会一下风格差异。

<?php
$count = 1;
while($count <= 10):
    echo "第 {$count} 次循环<br/>";
    $count++;
endwhile;
?>

输出和第一个例子一样。功能上没有优劣,纯看团队编码规范和个人偏好。

3. 字符递增:理解PHP的字母比较

while不仅可以处理数字,还能处理字符。PHP在比较字符时,会基于ASCII码或字母顺序来判断大小。

<?php
$letter = 'A';
while ($letter < 'H') {
    echo "当前字母:{$letter}<br/>";
    $letter++; // 字符也可以自增,'A'变'B',以此类推
}
?>

这段代码会输出A到G,到H时条件$letter < 'H'不成立,循环终止。个人经验分享:字符自增在某些生成序列号的场景里偶尔能派上用场,但要注意它的边界行为。$letter从'Z'再自增会变成'AA',而不是很多人直觉中的'['。这个细节在写代码时值得留意。

Nested While Loop:嵌套While循环

一个while循环内部再放一个while循环,就构成了嵌套循环。执行规则和其他循环的嵌套一样:外层每执行一次,内层会完整地从初始条件跑完一轮,直到内层条件为假,退回外层。

嵌套循环在看图理解上比较直观,我们用一个输出坐标网格的例子来演示:

<?php
$row = 1;
while($row <= 3) {
    $col = 1; // 关键:内层开始前,要把内层计数器重置
    while($col <= 3) {
        echo "坐标 ({$row}, {$col}) &nbsp;";
        $col++;
    }
    echo "<br/>"; // 一行输出完换行
    $row++;
}
?>

输出结果:

坐标 (1, 1) 坐标 (1, 2) 坐标 (1, 3)
坐标 (2, 1) 坐标 (2, 2) 坐标 (2, 3)
坐标 (3, 1) 坐标 (3, 2) 坐标 (3, 3)

解释:当$row为1时,内层$col从1跑到3,输出第一行的三个坐标。内层循环结束后,$row加1变成2,再次进入内层时,因为$col = 1这行重置语句,内层重新从1开始跑。总共3×3=9次迭代。

一个容易犯的错误:忘记在每次外层循环开始时重置内层计数器。如果你把$col = 1写在了外层循环外面,那第二轮外层开始时,$col还停留在上一轮结束时的值(4),内层条件$col <= 3直接为假,后面两行的坐标就不会输出了。

再来看一个输出简易乘法网格的例子:

<?php
$x = 1;
while($x <= 2) {
    $y = 1;
    while($y <= 4) {
        echo "{$x} × {$y} = " . ($x * $y) . " &nbsp;&nbsp;";
        $y++;
    }
    echo "<br/>";
    $x++;
}
?>

输出:

1 × 1 = 1  1 × 2 = 2  1 × 3 = 3  1 × 4 = 4
2 × 1 = 2  2 × 2 = 4  2 × 3 = 6  2 × 4 = 8

外层2次迭代,内层4次,总共8次。这个模式和编写乘法表、生成报表分页表头的逻辑是相通的。

关于无限循环

有意或无意地写出无限循环,是每个PHP开发者都会经历的阶段。语法上很简单:

while(true) {
    // 没有出口条件的代码
}

这种结构本身不是坏人。在编写守护进程、WebSocket服务或者需要持续监听消息队列的脚本时,while(true)是标准做法。但这类场景里,循环体内部必须要有break或者sleep之类的控制逻辑,否则CPU会被瞬间拉满。

主观建议:在代码号学习编程的过程中,如果你不确定一个循环条件该怎么写,先不要用while(true)。从明确的while(有意义的条件)开始,边界更可控。等你对流程控制很熟练了,再用while(true)配合break去处理那些确实不知道何时结束的复杂场景。如果你发现自己的代码里出现了一个while(true)但里面没有break,那大概率是个bug。

理解while循环的关键,不在于记住语法(语法确实很简单),而在于想清楚“我的终止条件到底是什么”以及“循环体内的每一步是否在推动这个条件走向终止”。把这两个问题想明白,while就能成为你处理不确定次数的重复任务时比较可靠的工具。

← PHP Foreach循环:数组遍历的核心利器 PHP Do-While循环:确保至少执行一次的出口控制循环 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号