# PHP 中的控制流

> 原文： [https://zetcode.com/lang/php/flowcontrol/](https://zetcode.com/lang/php/flowcontrol/)

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

## PHP `if`语句

`if`语句具有以下一般形式：

```php
if (expression)
    statement

```

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

`ifstatement.php`

```php
<?php

$num = 31;

if ($num > 0) 
    echo "\$num variable is positive\n";

```

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

```php
$ php ifstatement.php 
$num variable is positive

```

这是示例的输出。

`ifstatement2.php`

```php
<?php

$num = 31;

if ($num > 0) {
    echo "\$num variable is positive\n";
    echo "\$num variable equals to $num\n";
}

```

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

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

`boyorgirl.php`

```php
<?php

$sex = "female";

if ($sex == "male") {
   echo "It is a boy\n";
} else {
   echo "It is a girl\n";   
}

```

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

```php
$ php boyorgirl.php 
It is a girl

```

This is the output of the example.

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

`ifelsestm.php`

```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
$ 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`语句是选择控制流语句。 它允许变量或表达式的值通过多路分支控制程序执行的流程。 与使用`if`和`elseif`语句相比，它以更简单的方式创建多个分支。

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

`domains.php`

```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
$ php domains.php 
Slovakia

```

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

## PHP `while`循环

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

这是`while`循环的一般形式：

```php
while (expression):
    statement

```

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

`whilestm.php`

```php
<?php

$i = 0;

while ($i < 5) {
    echo "PHP language\n";
    $i++;
}

```

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

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

```php
$i = 0;

```

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

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

```

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

```php
$i++;

```

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

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

```

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

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

`dowhile.php`

```php
<?php

$count = 0;

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

```

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

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

`seasons.php`

```php
<?php

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

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

```

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

```php
$ php seasons.php 
Spring
Summer
Autumn
Winter

```

这是`seasons.php`脚本的输出。

## PHP 关键字

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

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

`forloop.php`

```php
<?php

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

$len = count($days);

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

```

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

```php
$len = count($days);

```

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

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

```

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

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

```

这是`forloop.php`脚本的输出。

## PHP `foreach`语句

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

`foreachstm.php`

```php
<?php

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

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

echo "\n";

```

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

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

```

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

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

```

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

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

`foreachstm2.php`

```php
<?php 

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

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

```

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

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

```

这是脚本的结果。

## PHP `break`，`continue`语句

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

`testbreak.php`

```php
<?php

while (true) {

    $val = rand(1, 30);
    echo $val, " ";
    if ($val == 22) break;
}

echo "\n";

```

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

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

```

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

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

`testcontinue.php`

```php
<?php

$num = 0;

while ($num < 1000) {

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

    echo "$num ";

}

echo "\n";

```

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

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

```

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

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