foreach遍历最安全,不依赖键名连续性;PHP索引数组底层为关联数组,键可能不连续或含字符串;for循环易越界或漏项,foreach自动按实际键值对迭代。

用 foreach 遍历最安全,不依赖键名连续性
PHP 索引数组的“索引”只是习惯叫法,底层仍是关联数组,键可能是 0、1、3(比如删过元素),甚至混着字符串键。直接用 for 循环配 count() 容易越界或漏项。foreach 自动按当前实际键值对迭代,不关心键是否“整齐”。
实操建议:
- 始终优先写
foreach ($arr as $value)—— 只要取值 - 需要键时写
foreach ($arr as $key => $value)—— 键可能是整数也可能是字符串,别假设一定是int - 避免
for ($i = 0; $i ,尤其在循环体里修改数组时,<code>count()结果可能滞后
for 循环只在确定键严格连续且不修改数组时可用
如果你明确知道数组是“纯正”的索引数组(键从 0 开始、连续递增、没被 unset() 或 array_splice() 动过),for 是可行的,性能略优于 foreach(但差异微乎其微)。
常见错误现象:
- 删掉中间元素后仍用
for,访问$arr[2]时返回NULL或触发Notice: Undefined offset - 用
array_values()重排后再for—— 多此一举,不如直接foreach
示例对比:
foreach
- 写成
foreach ($arr as &$value),不是foreach ($arr as $value) - 循环结束后记得
unset($value),否则后续代码中$value仍引用最后一个元素,可能引发意外赋值 - 不能在引用遍历中用
array_push()或unset()改键结构,会报Warning: Invalid argument supplied for foreach()
正确写法:
$arr = [1, 2, 3];
foreach ($arr as &$v) {
$v *= 2;
}
unset($v); // 关键!
// $arr 现在是 [2, 4, 6]
别用 each() 和 list() + each()
each() 在 PHP 7.2+ 已废弃,PHP 8.0+ 彻底移除;list() + each() 写法既难读又不可靠,内部指针易混乱,还无法处理空数组。
替代方案就一个:foreach。它更简洁、更稳定、无需手动维护内部指针。
容易被忽略的地方:很多人写脚本时顺手用 while (list($k, $v) = each($arr)),这在新版 PHP 直接报致命错误。检查旧代码时重点搜 each( 和 list( 搭配。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











