2024 年 PHP 日本大会

for

(PHP 4, PHP 5, PHP 7, PHP 8)

for 循环是 PHP 中最复杂的循环。它们的行为类似于其 C 语言对应物。for 循环的语法是:

for (expr1; expr2; expr3)
    statement

第一个表达式 (expr1) 在循环开始时无条件地评估(执行)一次。

在每次迭代开始时,都会评估 expr2。如果其评估结果为 true,则循环继续执行,并执行嵌套语句。如果其评估结果为 false,则循环执行结束。

在每次迭代结束时,都会评估(执行)expr3

每个表达式可以为空,或者包含多个以逗号分隔的表达式。expr2 中,所有以逗号分隔的表达式都会被评估,但结果取自最后一部分。expr2 为空意味着循环应该无限运行(PHP 隐式地将其视为 true,就像 C 语言一样)。这可能不像你想象的那么没用,因为你经常希望使用条件 break 语句而不是 for 真值表达式来结束循环。

考虑以下示例。它们都显示数字 1 到 10

<?php
/* 示例 1 */

for ($i = 1; $i <= 10; $i++) {
echo
$i;
}

/* 示例 2 */

for ($i = 1; ; $i++) {
if (
$i > 10) {
break;
}
echo
$i;
}

/* 示例 3 */

$i = 1;
for (; ; ) {
if (
$i > 10) {
break;
}
echo
$i;
$i++;
}

/* 示例 4 */

for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
?>

当然,第一个示例看起来是最简洁的(或者可能是第四个),但是你可能会发现能够在 for 循环中使用空表达式在很多情况下都非常方便。

PHP 还支持 for 循环的替代“冒号语法”。

for (expr1; expr2; expr3):
    statement
    ...
endfor;

许多用户通常像下面的示例一样迭代数组。

<?php
/*
* 这是一个包含一些我们想要在 for 循环中修改的数据的数组。
*/
$people = array(
array(
'name' => 'Kalle', 'salt' => 856412),
array(
'name' => 'Pierre', 'salt' => 215863)
);

for(
$i = 0; $i < count($people); ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}
?>

上述代码可能很慢,因为数组大小在每次迭代中都会被获取。由于大小从未改变,因此可以通过使用中间变量存储大小而不是重复调用 count() 来轻松优化循环。

<?php
$people
= array(
array(
'name' => 'Kalle', 'salt' => 856412),
array(
'name' => 'Pierre', 'salt' => 215863)
);

for(
$i = 0, $size = count($people); $i < $size; ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}
?>

添加备注

用户贡献的备注 2 条备注

matthiaz
12年前
循环遍历字母是可能的。我很惊讶很少有人知道这一点。

for($col = 'R'; $col != 'AD'; $col++) {
echo $col.' ';
}

返回:R S T U V W X Y Z AA AB AC

请注意,你不能使用 $col < 'AD'。它只与 != 一起使用。
在处理 Excel 列时非常方便。
nzamani at cyberworldz dot de
23年前
关于循环速度的关键点在于,中间和最后一个表达式在每次循环时都会执行。
因此,你应该尝试将所有不变的东西从循环中移除。
通常,你使用一个函数来检查循环的最大次数。例如:

<?php
for ($i = 0; $i <= somewhat_calcMax(); $i++) {
somewhat_doSomethingWith($i);
}
?>

更快的写法是:

<?php
$maxI
= somewhat_calcMax();
for (
$i = 0; $i <= $maxI; $i++) {
somewhat_doSomethingWith($i);
}
?>

这里还有一个技巧:

<?php
$maxI
= somewhat_calcMax();
for (
$i = 0; $i <= $maxI; somewhat_doSomethingWith($i++)) ;
?>

函数调用后 $i 才会自增(后增量)。
To Top