原文: https://zetcode.com/lang/php/flowcontrol/

在 PHP 教程的这一部分中,我们讨论流控制。 我们定义了几个关键字,这些关键字使我们能够控制 PHP 脚本的流程。

PHP if语句

if语句具有以下一般形式:

  1. if (expression)
  2. statement

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

ifstatement.php

  1. <?php
  2. $num = 31;
  3. if ($num > 0)
  4. echo "\$num variable is positive\n";

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

  1. $ php ifstatement.php
  2. $num variable is positive

这是示例的输出。

ifstatement2.php

  1. <?php
  2. $num = 31;
  3. if ($num > 0) {
  4. echo "\$num variable is positive\n";
  5. echo "\$num variable equals to $num\n";
  6. }

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

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

boyorgirl.php

  1. <?php
  2. $sex = "female";
  3. if ($sex == "male") {
  4. echo "It is a boy\n";
  5. } else {
  6. echo "It is a girl\n";
  7. }

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

  1. $ php boyorgirl.php
  2. It is a girl

This is the output of the example.

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

ifelsestm.php

  1. <?php
  2. echo "Enter a number: ";
  3. $a = intval(fgets(STDIN));
  4. if ($a < 0) {
  5. printf("%d is a negative number\n", $a);
  6. } elseif ($a == 0) {
  7. printf("%d is a zero\n", $a);
  8. } elseif ($a > 0) {
  9. printf("%d is a positive number\n", $a);
  10. }

我们使用fgets()函数从用户读取一个值。 将测试该值是负数还是正数或等于零。

  1. $ php ifelsestm.php
  2. Enter a number: 4
  3. 4 is a positive number
  4. $ php ifelsestm.php
  5. Enter a number: -3
  6. -3 is a negative number

程序的示例输出。

PHP switch语句

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

switch语句与其他两个关键字一起使用:casebreakcase关键字用于根据圆括号中的值测试标签。 如果标签等于该值,则执行案例后面的语句。 break关键字用于跳出switch语句。 有一个可选的default语句。 如果所有标签都不等于该值,则执行默认语句。

domains.php

  1. <?php
  2. $domain = 'sk';
  3. switch ($domain) {
  4. case 'us':
  5. echo "United States\n";
  6. break;
  7. case 'de':
  8. echo "Germany\n";
  9. break;
  10. case 'sk':
  11. echo "Slovakia\n";
  12. break;
  13. case 'hu':
  14. echo "Hungary\n";
  15. break;
  16. default:
  17. echo "Unknown\n";
  18. break;
  19. }

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

  1. $ php domains.php
  2. Slovakia

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

PHP while循环

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

这是while循环的一般形式:

  1. while (expression):
  2. statement

当表达式的值为真时,while循环执行该语句。 该语句是一个简单的语句,以分号或用大括号括起来的复合语句终止。

whilestm.php

  1. <?php
  2. $i = 0;
  3. while ($i < 5) {
  4. echo "PHP language\n";
  5. $i++;
  6. }

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

while循环包含三个部分:初始化,测试和更新。 语句的每次执行都称为循环。

  1. $i = 0;

我们启动$i变量。 它在我们的脚本中用作计数器。

  1. while ($i < 5) {
  2. ...
  3. }

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

  1. $i++;

while循环的最后第三阶段是更新。 计数器增加。 请注意,对while循环的不正确处理可能会导致循环不断。

  1. $ php whilestm.php
  2. PHP language
  3. PHP language
  4. PHP language
  5. PHP language
  6. PHP language

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

do while循环是while循环的版本。 不同之处在于,保证该版本至少运行一次。

dowhile.php

  1. <?php
  2. $count = 0;
  3. do {
  4. echo "$count\n";
  5. } while ($count != 0)

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

while循环通常与list()each()函数一起使用。

seasons.php

  1. <?php
  2. $seasons = ["Spring", "Summer", "Autumn", "Winter"];
  3. while (list($idx , $val) = each($seasons)) {
  4. echo "$val\n";
  5. }

$seasons数组有四个季节。 我们浏览所有值并将它们打印到控制台。 each()函数从数组返回当前键和值对,并前进数组光标。 当函数到达数组末尾时,它返回false并终止循环。 each()函数返回一个数组。 赋值的左侧也必须有一个数组。 我们使用list()函数从两个变量创建一个数组。

  1. $ php seasons.php
  2. Spring
  3. Summer
  4. Autumn
  5. Winter

这是seasons.php脚本的输出。

PHP 关键字

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

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

forloop.php

  1. <?php
  2. $days = [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
  3. "Saturday", "Sunday" ];
  4. $len = count($days);
  5. for ($i = 0; $i < $len; $i++) {
  6. echo $days[$i], "\n";
  7. }

我们每周有几天。 我们希望从数组中打印所有这些天。

  1. $len = count($days);

或者我们可以以编程方式找出数组中的项目数。

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

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

  1. $ php forloop.php
  2. Monday
  3. Tuesday
  4. Wednesday
  5. Thursday
  6. Friday
  7. Saturday
  8. Sunday

这是forloop.php脚本的输出。

PHP foreach语句

foreach构造简化了遍历数据集合的过程。 它没有明确的计数器。 foreach语句一个接一个地遍历数组,并将当前值复制到构造中定义的变量中。 在 PHP 中,我们可以使用它遍历数组。

foreachstm.php

  1. <?php
  2. $planets = [ "Mercury", "Venus", "Earth", "Mars", "Jupiter",
  3. "Saturn", "Uranus", "Neptune" ];
  4. foreach ($planets as $item) {
  5. echo "$item ";
  6. }
  7. echo "\n";

在此示例中,我们使用foreach语句遍历一系列行星。

  1. foreach ($planets as $item) {
  2. echo "$item ";
  3. }

foreach语句的用法很简单。 $planets是我们迭代通过的数组。 $item是具有数组中当前值的临时变量。 foreach语句遍历所有行星并将它们打印到控制台。

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

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

foreach语句还有另一种语法。 它与地图一起使用。

foreachstm2.php

  1. <?php
  2. $benelux = [ 'be' => 'Belgium',
  3. 'lu' => 'Luxembourgh',
  4. 'nl' => 'Netherlands' ];
  5. foreach ($benelux as $key => $value) {
  6. echo "$key is $value\n";
  7. }

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

  1. $ php foreachstm2.php
  2. be is Belgium
  3. lu is Luxembourgh
  4. nl is Netherlands

这是脚本的结果。

PHP breakcontinue语句

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

testbreak.php

  1. <?php
  2. while (true) {
  3. $val = rand(1, 30);
  4. echo $val, " ";
  5. if ($val == 22) break;
  6. }
  7. echo "\n";

我们定义了一个无限的while循环。 使用break语句,只有一种方法可以跳出这样的循环。 我们从 1 到 30 中选择一个随机值并打印出来。 如果该值等于 22,则结束无穷的while循环。

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

我们可能会得到这样的东西。

在下面的示例中,我们打印一个数字列表,这些数字不能除以 2 而没有余数。

testcontinue.php

  1. <?php
  2. $num = 0;
  3. while ($num < 1000) {
  4. $num++;
  5. if (($num % 2) == 0) continue;
  6. echo "$num ";
  7. }
  8. echo "\n";

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

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

如果表达式$num % 2返回 0,则可以将所讨论的数字除以 2。执行continue语句,并跳过循环的其余部分。 在我们的例子中,循环的最后一条语句将被跳过,并且数字不会输出到控制台。 下一个迭代开始。

在 PHP 教程的这一部分中,我们正在讨论控制流结构。