ZetCode

PHP 流程控制

最后修改于 2025 年 2 月 16 日

在本文中,我们将展示如何在 PHP 中控制程序的流程。

PHP if 语句

if 关键字用于检查表达式是否为真。如果为真,则执行一条语句。该语句可以是一个单语句或一个复合语句。复合语句由用大括号括起来的多个语句组成。

ifstatement.php
<?php

$num = 31;

if ($num > 0) {

    echo "\$num variable is positive\n";
}

我们有一个 $num 变量。它被赋值为 31。if 关键字检查一个布尔表达式。该表达式放在方括号之间。表达式 31 > 0 为真,因此执行下一条语句。如果只有一个要执行的语句,则大括号是可选的。

$ php ifstatement.php
$num variable is positive

如果我们打算执行多个语句,我们必须将它们放在方括号内。如果我们不使用它们,则只会执行第一个语句。大括号构成 if 语句的*主体*。

ifstatement2.php
<?php

$num = 31;

if ($num > 0) {

    echo "\$num variable is positive\n";
    echo "\$num variable equals to $num\n";
}

我们可以使用 else 关键字来创建一个简单的分支。如果 if 关键字后面的方括号内的表达式计算结果为假,则会自动执行 else 主体内的语句。

boyorgirl.php
<?php

$sex = "female";

if ($sex == "male") {

   echo "It is a boy\n";
} else {

   echo "It is a girl\n";
}

我们有一个 $sex 变量。它有一个 "female" 字符串。布尔表达式计算结果为假,我们在控制台中得到 "It is a girl"。

$ php boyorgirl.php
It is a girl

我们可以使用 elseif 关键字创建多个分支。仅当前一个条件未满足时,elseif 关键字才会测试另一个条件。请注意,我们可以在测试中使用多个 elseif 关键字。

ifelsestm.php
<?php

echo "Enter a number: ";

$a = intval(fgets(STDIN));

if ($a < 0) {

    printf("%d is a negative number\n", $a);
} elseif ($a == 0) {

    printf("%d is a zero\n", $a);
} elseif ($a > 0) {

    printf("%d is a positive number\n", $a);
}

我们使用 fgets 函数从用户那里读取一个值。测试该值是否为负数或正数,或者是否等于零。

$ php ifelsestm.php
Enter a number: 4
4 is a positive number
$ php ifelsestm.php
Enter a number: -3
-3 is a negative number

PHP switch 语句

switch 语句是一个选择控制流语句。它允许使用变量或表达式的值通过多路分支来控制程序执行的流程。它以比使用 ifelseif 语句更简单的方式创建多个分支。

switch 语句与另外两个关键字一起使用:casebreakcase 关键字用于将标签与圆括号中的值进行比较。如果标签等于该值,则执行 case 后面的语句。break 关键字用于跳出 switch 语句。有一个可选的 default 语句。如果没有任何标签等于该值,则执行 default 语句。

domains.php
<?php

$domain = 'sk';

switch ($domain) {

    case 'us':
        echo "United States\n";
    break;
    case 'de':
        echo "Germany\n";
    break;
    case 'sk':
        echo "Slovakia\n";
    break;
    case 'hu':
        echo "Hungary\n";
    break;
    default:
        echo "Unknown\n";
    break;
}

在我们的脚本中,我们有一个 $domains 变量。它有 'sk' 字符串。我们使用 switch 语句来测试变量的值。有几个选项。如果该值等于 'us',则将 "United States" 字符串打印到控制台。

$ php domains.php
Slovakia

我们得到 "Slovakia"。如果我们将 $domains 变量更改为 'rr',我们将得到 "Unknown" 字符串。

PHP match 表达式

match 表达式是一个更强大的选择语句。它使用严格的标识检查 (===) 而不是较弱的相等检查 (==) 来比较值。

types.php
<?php 

$vals = ['sky', true, -4, [1, 2, 3, 4]];

foreach ($vals as $val) {
    
    $t = gettype($val);

    $res = match($t) {

        'string' => 'value is a string',
        'integer' => 'value is an integer',
        'boolean' => 'value is a boolean', 
        'array' => 'value is an array',
        default => 'unknown type'
    };

    echo "$res\n";

}

在示例中,我们有一个包含不同类型元素的数组。使用 match 表达式和 gettype 函数,我们可以获取每个元素的类型。

$ php types.php 
value is a string
value is a boolean
value is an integer
value is an array

PHP while 循环

while 是一个控制流语句,它允许根据给定的布尔条件重复执行代码。

当表达式计算结果为真时,while 循环将执行该语句。该语句是由分号终止的简单语句,或者是由大括号括起来的复合语句。

whilestm.php
<?php

$i = 0;

while ($i < 5) {

    echo "PHP language\n";
    $i++;
}

在代码示例中,我们反复将 "PHP language" 字符串打印到控制台。

while 循环有三个部分:初始化、测试和更新。每次执行该语句都称为一个周期。

$i = 0;

我们初始化 $i 变量。它在我们的脚本中用作计数器。

while ($i < 5) {
   ...
}

方括号内的表达式是第二阶段,测试。while 循环执行主体中的语句,直到表达式计算结果为假。

$i++;

while 循环的最后第三个阶段是更新;一个计数器递增。请注意,对 while 循环的处理不当可能导致无限循环。

$ php whilestm.php
PHP language
PHP language
PHP language
PHP language
PHP language

程序将消息打印到控制台五次。

do while 循环是 while 循环的一个版本。区别在于此版本保证至少运行一次。

dowhile.php
<?php

$count = 0;

do {
    echo "$count\n";
} while ($count != 0)

首先执行迭代,然后计算真值表达式。

while 循环通常与 listeach 函数一起使用。

seasons.php
<?php

$seasons = ["Spring", "Summer", "Autumn", "Winter"];

while (list($idx , $val) = each($seasons)) {
    echo "$val\n";
}

我们在 $seasons 数组中有四个季节。我们遍历所有值并将它们打印到控制台。each 函数从数组中返回当前键和值对,并推进数组游标。当该函数到达数组的末尾时,它将返回 false,循环终止。

each 函数返回一个数组。赋值的左侧也必须有一个数组。我们使用 list 函数从两个变量创建一个数组。

$ php seasons.php
Spring
Summer
Autumn
Winter

PHP for 关键字

for 循环与 while 循环的作用相同。只是它将所有三个阶段(初始化、测试和更新)放在一个地方,即圆括号之间。它主要用于在进入循环之前知道迭代次数的情况。

让我们来看一个 for 循环的例子。

forloop.php
<?php

$days = [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
              "Saturday", "Sunday" ];

$len = count($days);

for ($i = 0; $i < $len; $i++) {

    echo $days[$i], "\n";
}

我们有一个一周中各天的数组。我们希望从该数组中打印所有这些天。

$len = count($days);

或者我们可以通过编程方式计算数组中的项目数。

for ($i = 0; $i < $len; $i++) {
   echo $days[$i], "\n";
}

这里我们有 for 循环结构。三个阶段由分号分隔。首先,初始化 $i 计数器。初始化部分只发生一次。接下来,进行测试。如果测试的结果为真,则执行该语句。最后,计数器递增。这是一个周期。for 循环迭代,直到测试表达式为假。

$ php forloop.php
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday

PHP foreach 语句

foreach 结构简化了对数据集合的遍历。它没有显式的计数器。foreach 语句逐个遍历数组,并将当前值复制到在该结构中定义的变量中。在 PHP 中,我们可以使用它来遍历数组。

foreachstm.php
<?php

$planets = [ "Mercury", "Venus", "Earth", "Mars", "Jupiter",
                 "Saturn", "Uranus", "Neptune" ];

foreach ($planets as $item) {
    echo "$item ";
}

echo "\n";

在此示例中,我们使用 foreach 语句遍历行星数组。

foreach ($planets as $item) {
    echo "$item ";
}

foreach 语句的用法很简单。$planets 是我们要遍历的数组。$item 是一个临时变量,它具有来自数组的当前值。foreach 语句遍历所有行星并将它们打印到控制台。

$ php foreachstm.php
Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune

运行上面的 PHP 脚本会给出此输出。

foreach 语句还有另一种语法。它用于映射。

foreachstm2.php
<?php

$benelux =  [ 'be' => 'Belgium',
              'lu' => 'Luxembourgh',
              'nl' => 'Netherlands' ];

foreach ($benelux as $key => $value) {

    echo "$key is $value\n";
}

在我们的脚本中,我们有一个 $benelux 映射。它包含映射到比荷卢经济联盟国家的域名。我们遍历数组,并将键及其值打印到控制台。

$ php foreachstm2.php
be is Belgium
lu is Luxembourgh
nl is Netherlands

PHP break、continue 语句

break 语句用于终止循环。continue 语句用于跳过循环的一部分并继续进行循环的下一次迭代。

testbreak.php
<?php

while (true) {

    $val = rand(1, 30);
    echo $val, " ";

    if ($val == 22) break;
}

echo "\n";

我们定义了一个无限 while 循环。跳出此类循环的唯一方法是使用 break 语句。我们选择一个 1 到 30 之间的随机值并打印它。如果该值等于 22,我们结束无限的 while 循环。

$ php testbreak.php
6 11 13 5 5 21 9 1 21 22

我们可能会得到类似这样的结果。

在以下示例中,我们打印一个无法被 2 整除而没有余数的数字列表。

testcontinue.php
<?php

$num = 0;

while ($num < 1000) {

    $num++;
    if (($num % 2) == 0) continue;

    echo "$num ";

}

echo "\n";

我们使用 while 循环遍历数字 1..999。

if (($num % 2) == 0) continue;

如果表达式 $num % 2 返回 0,则可以被 2 整除。执行 continue 语句,并跳过循环的其余部分。在我们的例子中,跳过了循环的最后一个语句,并且该数字没有打印到控制台。启动下一次迭代。

来源

PHP 语言参考

在本文中,我们介绍了 PHP 的流程控制。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有 PHP 教程。