首选foreach,适用于绝大多数场景,支持索引与关联数组,语法简洁、安全高效;需修改原数组时加引用并unset;for仅适用于连续数字索引且需精确控制;while基本不用。

选对循环方式,关键看三点:数组类型、是否需改原数组、性能敏感度。foreach是默认首选,for适合纯数字索引且需精确控制,while基本不用于常规数组遍历。
什么情况该用 foreach
绝大多数数组遍历场景都该用它——不管索引数组还是关联数组,语法干净、无越界风险、性能稳定。
- 只需读取值:用 foreach ($arr as $value)
- 需要键和值(比如处理表单或配置):用 foreach ($arr as $key => $value),键自动适配数字或字符串
- 要修改原数组元素:必须加引用 foreach ($arr as &$value),循环结束后记得 unset($value) 防止后续意外修改
- 遍历多维数组:嵌套 foreach 最清晰,比如二维用户列表逐层展开
什么情况该用 for
只推荐用于连续数字索引的数组,且你明确知道下标从 0 开始、中间无空缺。
- 边界写法必须统一:for ($i = 0; $i —— 用
- 别在条件里反复调用 count():如果数组长度不变,提前存变量,比如 $len = count($arr); for ($i = 0; $i
- 禁止用 for 遍历关联数组:$arr['name'] 无法用 $arr[0] 访问,会返回 null 或 notice
- 适合需要反向遍历、跳步(如 $i += 2)、或配合其他计数逻辑的场景
while 基本不该用来遍历普通数组
PHP 早已废弃 each() 等指针函数,while 配合 reset()+current()+next() 写法冗长、易出错、行为不稳定,还可能因指针未重置导致漏数据或死循环。
立即学习“PHP免费学习笔记(深入)”;
- 除非你在维护非常老的 PHP 5.3 以下代码,否则不要用 while 遍历数组
- while 更适合等待条件变化的场景,比如读文件流、轮询接口响应、处理用户输入
- 若真要用 while 模拟数组遍历,请改用更安全的 while ($item = array_shift($arr))(但会清空原数组,慎用)
性能差异其实没那么玄乎
在现代 PHP(7.4+)中,差异主要出现在高频、大数据量或极端优化场景:
- 遍历普通数组:foreach ≈ for > while(while 因函数调用开销略慢)
- 数组长度已知且固定:for 略快于 foreach(少一个迭代器对象创建)
- 数组长度需每次计算(比如在循环里动态增删):for 中反复 count() 会明显拖慢,此时 foreach 更稳
- 内存压力大时:foreach 在 PHP 8+ 经过大量优化,GC 压力比手写 while 小得多



















