foreach遍历索引数组时键名默认为整数,不可硬写字符串;需校验is_array()再遍历,修改元素须用&引用并unset,否则易引发意外覆盖或警告。

foreach 遍历索引数组时,键名默认是数字,别硬写字符串
PHP 的 foreach 对普通数组(即索引数组,如 ['a', 'b', 'c'])直接遍历时,默认提供的是值,键名是隐式整数(0、1、2…)。很多人误以为要像关联数组一样显式声明键,结果写出 foreach ($arr as 'key' => $val) 这种语法错误。
- 正确写法是
foreach ($arr as $val)(只取值)或foreach ($arr as $index => $val)(取索引+值) -
$index是自动推导的整型下标,不是字符串,不能写成'0'或"key" - 如果数组被
unset()过或用array_values()重排过,索引可能不连续,但foreach仍按当前实际键遍历,不会跳过
遍历前先确认是不是真数组,避免 foreach 报 Warning
常见错误是把 null、false、字符串甚至对象传给 foreach,触发 Invalid argument supplied for foreach() 警告。PHP 不会自动转成空数组。
- 加一层判断:
is_array($arr) && !empty($arr),或者更稳妥地用is_array($arr) && count($arr) > 0 - 如果数据来自 API 或表单,可能得到
null,建议初始化为$arr = $data ?? [] - 注意:空数组
[]可以安全遍历,循环体一次都不执行,不会报错
修改数组元素要用 & 引用,否则原数组不变
默认情况下,foreach 中的 $val 是值的副本。想在循环里改原数组内容,必须用引用符号 &,否则改的只是临时变量。
foreach ($arr as &$val) {
$val = strtoupper($val);
}
unset($val); // 循环后记得 unset 引用,避免后续意外覆盖
- 漏掉
unset($val)可能导致下一个普通赋值语句(如$val = 123)悄悄改掉数组最后一个元素 - 如果同时需要键和引用,写成
foreach ($arr as $key => &$val) - 对多维数组,只引用最内层值即可,不用全链引用
性能上,foreach 比 for + count() 更快,尤其大数组
有人习惯用 for ($i = 0; $i ,但每次循环都调用 <code>count(),在大数组中开销明显。而 foreach 内部使用数组的内部指针,只计算一次长度。
- 实测:10 万元素数组,
foreach比for + count()快约 15%~20% - 如果循环中会动态增删数组元素,
foreach行为不可靠(可能跳过新元素或重复遍历),此时该换while (list() = each())或重索引后用for - PHP 7.4+ 支持
foreach ($arr as $k => $v)解构短数组,但普通遍历无需刻意用这个
unset,或者把非数组当数组传进去——这两个点线上 debug 花的时间,往往比写逻辑还长。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











