for循环难点在于变量作用域、边界判断和数组遍历逻辑;php 8.4报错更严格,要求显式初始化、正确边界(如$i>=0)、慎用嵌套中的break/continue层级。

for 循环不是“学不会”,而是容易在写对语法后,栽在变量作用域、边界判断或数组遍历逻辑上。PHP 8.4 中它没变新,但错误更早暴露、提示更严格——你写的代码可能以前能跑,现在直接报 TypeError 或 Undefined offset。
初始化必须显式赋值,不能靠“默认为0”
PHP 不会自动把未声明的 $i 当作整数 0。漏掉 $i = 0,轻则触发 Undefined variable: i 警告,重则循环不执行(条件表达式里用到未定义变量,整个表达式结果为 false)。
- 错:
for ($i; $i —— <code>$i没初值,PHP 8.4 默认报E_NOTICE - 对:
for ($i = 0; $i —— 显式初始化,类型明确 - 进阶建议:在函数内用
int $i = 0声明(PHP 8.4 支持局部变量类型标注),配合静态分析工具提前发现类型错位
遍历数组时,count() 必须提前提取
把 count($arr) 直接写在 for 条件里,每次迭代都重新计算长度。对大数组是 O(n²) 开销;更危险的是,如果循环体里修改了数组(如 unset($arr[$i])),count() 结果实时变化,导致越界或漏项。
- 错:
for ($i = 0; $i - 对:
$len = count($arr); for ($i = 0; $i - 注意:如果
$arr可能为null或非数组,先做is_array($arr)判断,否则 PHP 8.4 会抛TypeError
倒序遍历要小心索引 0 和空数组
反向遍历常用在需要原地修改又避免索引错位的场景(比如删除满足条件的元素)。但写成 for ($i = count($arr) - 1; $i > 0; $i--) 会跳过索引 0 的元素。
- 错:
for ($i = count($arr) - 1; $i > 0; $i--)——$i最小只到 1 - 对:
for ($i = count($arr) - 1; $i >= 0; $i--) - 安全兜底:空数组时
count($arr) - 1是 -1,$i >= 0直接不进循环,没问题 - 替代方案:真要删元素,优先用
array_filter(),比手写倒序for更不易出错
break 和 continue 在嵌套循环里只作用于最近一层
很多人以为 continue 会跳到外层循环的更新表达式,其实它只影响当前所在的 for。嵌套两层时,想从内层直接跳到外层下一轮?得加数字层级。
- 内层
continue:只跳过本次内层循环剩余代码,然后执行内层的递增表达式(如$j++) - 内层
continue 2:跳过内层剩余 + 外层剩余,直接进入外层的递增表达式(如$i++) - 注意:
break 2同理,但别混用——break 2和continue 2的“2”都指跳过两层结构,不是跳过两次
真正难的不是写出一个能跑的 for,而是在修改数组、嵌套多层、混合条件时,仍能一眼看出 $i 的值、边界是否安全、以及 count() 是否被误调用。这些细节在调试时往往藏得深,等报出 Undefined offset 才回头翻循环头,已经多花了二十分钟。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











