PHP 循环可帮助您根据条件重复执行一段代码。您可以使用它们来处理数组或重复操作。您还可以使用它们根据逻辑跳过某些步骤。

在本文中,您将了解 PHP 循环的工作原理以及何时使用每种类型。

让我们开始吧。

了解 PHP 中的循环工作原理

循环允许 PHP 多次运行同一组指令。每次运行前,循环都会检查某个条件。如果条件成立,代码会再次运行;如果条件不成立,代码会停止运行。

循环有助于减少重复代码。您可以处理列表中的项目或检查值。循环允许您编写一次代码块并多次运行。

PHP 提供四种主要类型的循环:

  • while
  • do…while
  • for
  • foreach

让我们详细看看每一个

PHP 中while的循环

while 循环在运行代码块之前会检查条件是否为真。如果条件为真,则运行代码块。然后再次检查。循环重复进行,直到条件变为假。

语法如下:

while (condition) {
  // code block
}

以下是一个例子:

$count = 1;
while ($count <= 3) {
  echo "Count: $count\n";
  $count++;
}

此循环以 开始$count = 1。它打印该值,并每次加 1。当$count达到 4 时停止。

它给出以下输出:

Count: 1
Count: 2
Count: 3

这是另一个例子:

$index = 0;
$names = ['Tom', 'Anna', 'Joe'];
while ($index < count($names)) {
  echo $names[$index] . "\n";
  $index++;
}

此循环打印数组中的每个名称。它使用索引在列表中移动。

输出:

Tom
Anna
Joe

那么,什么时候应该使用 while 循环?

while如果想在运行代码之前先检查条件,请使用循环。如果条件从一开始就为假,循环就根本不应该运行,则此类型最适合。

以下是一个例子:

你要求用户输入一个数字。你只想在数字为正数时运行循环。

$number = getUserInput();

while ($number > 0) {
  echo "You entered: $number\n";
  $number = getUserInput();
}

如果第一个数字为零或负数,循环将跳过。这在这里是合理的——你只想让循环在有效数字时运行。

您将在下一部分了解 PHP 中do while循环的工作原理。

PHP 中do…while的循环

循环do...while运行一次代码块,然后检查条件。它总是至少运行一次。

do {
  // code block
} while (condition);

例子:

$start = 5;
do {
  echo "Start: $start\n";
  $start++;
} while ($start < 8);

此循环打印从 5 到 7 的数字。它在块运行后检查条件。

输出:

Start: 5
Start: 6
Start: 7

这是另一个例子:

$retry = 0;
do {
  echo "Attempt $retry\n";
  $retry++;
} while ($retry < 1);

即使一开始条件为假,代码也会运行一次。输出:

Attempt 0

当你希望代码至少运行一次时,使用do...while循环。当第一步必须在检查条件之前发生时,循环就很有意义。

以下是一个例子:

您希望至少向用户显示一次菜单。然后一直显示它,直到他们选择退出。

do {
  $option = showMenuAndGetChoice();
} while ($option != "exit");

无论如何,菜单只会出现一次。如果用户立即输入“exit”,循环会在运行一次后停止。

让我们继续下一节,看看 PHP 中最常见的循环,即 for 循环。

PHP 中for的循环

只有当你知道循环需要运行多少次时,循环for才会有效。它提供了一种简洁的方法,让你可以在一行代码中设置计数器、检查条件并更新计数器。这使得循环易于阅读和控制。

循环在括号内分为三部分:

  1. 开始– 设置循环。通常在这里定义一个计数器,例如$i = 0
  2. 条件– 当此部分为真时,循环运行。一旦变为假,循环就停止。
  3. 步骤– 每次循环运行后更新计数器。您可以在此处增加或减少该值。

结构如下:

for (start; condition; step) {
  // code block
}

以下是一个例子:

for ($i = 1; $i <= 3; $i++) {
  echo "Number: $i\n";
}

事情是这样的:

  • $i = 1设置起始值。
  • 条件$i <= 3检查循环是否应该运行。
  • 如果条件为真,则运行里面的代码。
  • 然后$i++将计数器加 1。
  • 循环重复,直到$i大于 3。

输出如下:

Number: 1
Number: 2
Number: 3

这是另一个例子:

for ($i = 2; $i <= 6; $i += 2) {
  echo "$i is even\n";
}

这里的步骤是$i += 2,而不仅仅是$i++。每次运行后都会加 2,$i而不是 1。所以值从 2 到 4,再到 6。这就是控制循环速度的方法。

输出如下:

2 is even
4 is even
6 is even

在以下情况下可以使用for循环:

  • 你确切地知道需要运行代码多少次
  • 您正在使用一个增加或减少的计数器
  • 您正在循环遍历一个范围,例如数字 1 到 10
  • 您希望将所有循环设置保存在一个地方

在下一节中,您将了解另一个名为 foreach的循环。让我们继续。

PHP 中foreach的循环

PHP 的 foreach循环专为处理数组而构建。它允许您逐个遍历数组中的每个元素。您无需计数器,也无需检查数组大小——PHP 会为您处理好这些。

有两种使用方法foreach,并且都只适用于数组或类似数组的对象:

  • 仅循环遍历值
  • 循环遍历键和值

让我们逐一看一下。

仅循环遍历值:此版本每次运行时都会从数组中给出一个值:

$colors = ['red', 'green', 'blue'];

foreach ($colors as $color) {
  echo "$color\n";
}

这里,数组有三个值。循环每次返回一个值。你获取的不是位置或索引,而是值。

输出如下:

red  
green  
blue

循环遍历键和值:此版本为您提供每个数组项的键和值。

以下是一个例子:

$person = ['name' => 'Alice', 'age' => 30, 'city' => 'Cape Town'];

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

这里$key保存每个索引或名称,并$value保存该键所存储的内容。

输出如下:

name: Alice  
age: 30  
city: Cape Town

当您想要标记数据、处理名称和值或构建表单或报告之类的内容时,这种格式会很有帮助。

请记住,foreach仅适用于数组或具有类似数组行为的对象(例如实现了 的对象Traversable)。不能将其与纯字符串或数字一起使用。

如果你尝试这样做:

foreach (123 as $item) {
  echo $item;
}

你收到错误。PHP 需要包含多个项的内容,例如数组或可迭代对象。

你可以使用基于条件或表达式的语句退出循环break。让我们继续下一部分,看看如何做到这一点。

break如何在PHP 中使用语句

PHP 中的break 语句会立即结束循环,即使条件仍然成立。其语法如下:

break;

以下是一个例子:

for ($i = 1; $i <= 5; $i++) {
  if ($i === 3) {
    break;
  }
  echo "$i\n";
}

当变为 3 时,此循环停止$i。输出:

1
2

这段 PHP 代码使用for循环从 1 数到 5。它包含一个条件,用于提前停止循环break。如果$i等于 3,则循环结束。

否则,打印 的值$i。输出为 1 和 2,并且在到达 3 之前退出循环。

以下是使用该break语句的一些常见原因:

  • 当你找到你需要的东西时
  • 如果你想在特定条件下退出
  • 在菜单或用户输入循环内
  • switch声明中

如果不使用 ,PHP 将在第一个匹配之后运行所有代码break。这可能会导致错误。

在下一节中,您将看到当某些条件为真时如何跳过循环的某些部分。

如何使用continue声明

PHP 的 continue 语句会跳过当前步骤的剩余循环。其语法如下:

continue;

以下是一个例子:

for ($i = 1; $i <= 4; $i++) {
  if ($i === 2) {
    continue;
  }
  echo "$i\n";
}

此循环不会打印 2,而是移至下一个值。输出:

1
3
4

那么,为什么要跳过部分循环呢 continue

在 PHP 中,当你想跳过当前循环块的剩余部分并转到下一个项目时,可以使用该continue语句。当你需要根据条件跳过循环中的某些步骤时,这会很有帮助。

您可以在foreach,fo或while循环中使用continue。如果某个值不符合您的要求,则跳过该值并继续执行。您不会停止循环,只会跳过当前运行。

那么为什么在某些情况下要避免循环?

循环可以让你完全控制,但也可能造成混乱。你会一遍又一遍地重复相同的逻辑。这会使代码更难阅读。如果你忘记更新计数器或及时中断,也存在出现 bug 的风险。

如果您只想对数组中的每个项目应用一个操作,那么循环可能感觉有点过头了。您不需要完全控制——只需要一种简洁的方式来映射值。这时,像这样的内置函数array_map就更有意义了。

在下一部分中,您将看到array_map当您想要更改数组中的每个项目时如何替换循环。

如何在PHP中用array_map()替代循环

PHP 的 array_map函数可以帮助您避免重复循环。它会将回调函数应用于一个或多个数组中的每个项目,并返回一个包含结果的新数组。

$numbers = [1, 2, 3, 4];
$doubled = array_map(fn($n) => $n * 2, $numbers);
print_r($doubled);

输出:

[2, 4, 6, 8]

这与循环的作用相同,foreach循环将每个数字乘以 2 并存储结果。但使用array_map,逻辑集中在一个地方。

您将函数和数组作为参数传递。这就是人们所说的“函数式风格”——使用专注于输入和输出的内置工具,而不是步骤或计数器。

你得到了相同的结果,但代码更简洁易读。由于array_map返回的是新数组,而不会改变原始数组,因此也避免了副作用。

在下一节中,您将了解嵌套循环的工作原理。

PHP 中嵌套循环的工作原理

嵌套循环是指一个循环位于另一个循环内部。外层循环控制更大的循环,而内层循环每次运行一次,就完全运行一次。

因此,如果每次循环外循环运行两次,内循环运行三次,则内循环总共运行六次。

例如:

for ($i = 1; $i <= 2; $i++) {
  for ($j = 1; $j <= 3; $j++) {
    echo "i=$i, j=$j\n";
  }
}

它的工作原理如下:

  • 外层循环使用$i。它从 1 开始并运行至$i <= 2
  • 这意味着外循环运行两次:一次 for$i = 1和一次 for $i = 2
  • 在其中,内循环使用$j。它从 1 开始并运行至$j <= 3
  • 因此,外层循环每次运行时,内层循环就会运行三次: for $j = 1$j = 2$j = 3

输出:

i=1, j=1
i=1, j=2
i=1, j=3
i=2, j=1
i=2, j=2
i=2, j=3

那么,如何使用带有数组的嵌套循环?

你也可以使用嵌套循环来读取二维数组。以下是一个使用矩阵的示例:

$matrix = [
  [1, 2],
  [3, 4]
];

foreach ($matrix as $row) {
  foreach ($row as $cell) {
    echo "$cell ";
  }
  echo "\n";
}

在这种情况下:

  • 外部foreach从矩阵中获取每一行。
  • 每个$row都是一个数组:首先[1, 2],然后[3, 4]
  • 内部foreach遍历行内的每个值。

所以输出是:

1 2
3 4

当你需要处理网格或矩阵时,可以使用嵌套循环。当你需要对值进行分组时,它也同样有效。

什么时候应该使用嵌套循环,什么时候不应该使用?

您可能有:

  • 矩阵中的行和列
  • 订单列表,每个订单包含商品
  • 类别,每个类别都有子类别

当你需要处理一个位于另一个组内的组时,嵌套循环会很有帮助。它们可以让你一步步地完成两个层级。

例如,如果您有按类型分组的产品,则可以对类型使用外循环,对内部的每个产品使用内循环。

但嵌套循环也有局限性。如果两个循环都运行多次,代码运行速度会很快变慢。循环套循环意味着总步骤数会快速增长。

如果外循环运行 100 次,内循环也运行 100 次,那么就需要 10,000 步。这可能会导致加载时间过长,甚至在处理大量数据集时导致服务器卡死。

嵌套循环可以解决实际问题,但请确保仅在合适时使用。并非所有任务都需要嵌套循环。如果可以用一个循环并清除数据来解决同一个问题,通常效果会更好。

总结

循环可以帮助您在 PHP 中重复执行任务。您可以根据需要使用 while、for 甚至 foreach。使用 break 可提前停止。使用 continue 可跳过步骤。如果您处理网格或分组数据,请使用嵌套循环。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。