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
才会有效。它提供了一种简洁的方法,让你可以在一行代码中设置计数器、检查条件并更新计数器。这使得循环易于阅读和控制。
循环在括号内分为三部分:
- 开始– 设置循环。通常在这里定义一个计数器,例如
$i = 0
。 - 条件– 当此部分为真时,循环运行。一旦变为假,循环就停止。
- 步骤– 每次循环运行后更新计数器。您可以在此处增加或减少该值。
结构如下:
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 可跳过步骤。如果您处理网格或分组数据,请使用嵌套循环。