for ($i = 0; $i < 5; $i++) { ... } 把代码块运行固定的次数。三个部分分别是初始化($i = 0,只运行一次)、条件($i < 5,每轮开始前检查)和步进($i++,每轮结束后运行)。条件一旦为 false,循环就结束。
循环结束后 $i 仍然存在,它的值是让条件变为 false 的那个值(6)。PHP 的循环变量没有块级作用域。
按索引遍历数组
对于键为 0, 1, 2 ... 的列表,计数器同时也是索引。先把 count() 的结果存进变量,这样就不会每轮都重新调用一次。
第一部分可以写多个用逗号分隔的表达式,$n = count($fruits) 就是这样只设置一次的。如果只需要每个值(不需要它前后的元素),foreach 写起来更短,也能用于键不是 0 到 n - 1 的数组。
倒数和步长大于 1
步进可以是任意表达式:$i-- 用来倒数,$i += 2 取每隔一个的数,$i *= 2 得到 2 的各次幂。
range('a', 'h') 生成数组 ['a', 'b', ... 'h']。用 range(1, 10) 配合 foreach 也能实现和 for 循环一样的计数,代价是要先生成整个数组。
break 和 continue
break 立即结束循环。continue 跳过本轮剩余的部分,直接跳到步进和下一次条件检查。
第二个循环的条件是空的,表示“永远为真”,所以它会一直运行到 break。在嵌套循环中,break 2 和 continue 2 作用于外层循环,下一个示例会演示。
嵌套 for 循环:乘法表
循环里套循环时,外层循环每运行一轮,内层循环都会完整地运行一遍。这里输出的是 HTML,所以“页面”标签页会显示一个真正的表格。
把 $size 改成 12 再运行一次。for (...): 和 endfor; 是替代语法,可以让夹在 HTML 标签之间的循环更易读。下面是用纯文本生成的同一张表,并用 break 2 同时结束两层循环:
常见错误:差一错误和死循环
for 循环有两个经典 bug:配合 count() 使用 <= 会多读一个越界的元素,PHP 会报告 Warning: Undefined array key 3,并把它当作 null;步进永远不会让计数器接近终点(本该写 $i++ 却写成了 $i--),条件就会一直为真。
对于事先无法知道要循环多少次的情况,比如一直读到文件末尾,用 while 循环更合适。
常见问题
PHP 中怎么按索引遍历数组?
对于键为 0、1、2 的列表,用 for ($i = 0; $i < count($arr); $i++) { echo $arr[$i]; }。大多数情况下 foreach ($arr as $i => $value) 更简单,同样能拿到索引,而且在键不是 0 到 n 减 1 时也能用。
PHP 中怎么跳出 for 循环?
break; 立即退出循环。在嵌套循环中,break 2; 会同时退出内层循环和它外面的一层。continue; 跳过本轮剩余的部分,直接进入下一轮。
PHP 中怎么用 for 循环倒数?
从大的数开始,用 >= 比较并递减:for ($i = 10; $i >= 1; $i--) { echo $i; }。步长不是 1 时,修改第三部分,例如 $i += 2 或 $i -= 5。
PHP 中什么时候用 for 而不用 foreach?
需要计数时(重复 5 次、1 到 100 的数字、每隔一个元素)或者需要按索引取前一个、后一个元素时,用 for。要访问数组的每个元素,尤其是没有数字索引的关联数组时,用 foreach。