php遍历数组最常用、最安全的方式是foreach,它兼容索引和关联数组,自动快照避免迭代干扰,支持解构修改值,对空数组天然友好;for仅适用于连续数字索引且需反向或跳跃遍历的场景。

PHP 遍历数组最常用、最安全的方式是用 foreach,不是 for 或 while + each() —— 后者在 PHP 8.0+ 已被移除,硬用会报 Undefined function each() 错误。
什么时候必须用 foreach?
绝大多数情况都该用它,尤其当你不需要手动控制索引、不修改原数组键值、且要兼容 PHP 7.4+ 和 PHP 8.x 时。foreach 是唯一能同时安全遍历索引数组和关联数组的内置结构。
- 它自动复制数组快照,循环中增删元素不影响当前迭代(避免
ArrayIterator或引用操作带来的意外跳过) - 支持解构语法:
foreach ($arr as $key => &$value)可直接修改值;但注意加&后需在循环结束后unset($value),否则下次循环可能污染下一个元素 - 对空数组天然友好,不报错也不进循环体,不用提前
if (!empty($arr))判断
for 循环只适合纯数字索引数组
如果你确定数组是连续、从 0 开始的整数索引(比如 [1, 2, 3]),且需要反向遍历或步长跳跃,for 才有存在价值。一旦数组键是字符串、缺失、或非顺序(如 ['a' => 1, 'c' => 3]),for ($i = 0; $i 会直接越界或漏项。
-
count($arr)在大数组中反复调用有轻微性能开销,建议提前提取:$len = count($arr); for ($i = 0; $i - 不要依赖
isset($arr[$i])做兜底 —— 它无法区分“键不存在”和“值为null” - PHP 8.0+ 中
for遍历关联数组基本等于写 bug,别试
需要修改原数组?小心引用和键丢失
想边遍历边改数组内容,最简方案是带引用的 foreach,但仅限值修改;若要增删键,必须用 foreach (array_keys($arr) as $key) 或显式 for + array_values() 重建索引。
-
foreach ($arr as &$v) { $v *= 2; }有效,但循环后务必unset($v),否则后续代码中$v仍指向最后一个元素,赋值会意外覆盖原数组 - 在循环中用
unset($arr[$key])不会中断当前foreach,但该键之后的元素不会被再次访问 —— 这不是 bug,是设计行为 - 想安全地过滤并重建数组,直接用
array_filter()或array_map(),比手写循环更可靠
真正容易被忽略的是:PHP 数组本质是有序哈希表,遍历顺序由插入顺序决定,不是键大小或字母序。哪怕键是数字字符串(如 '10'、'2'),foreach 也按你 => 赋值的先后走,不是按数值大小排 —— 这点在调试时经常让人愣住几秒。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











