foreach是PHP数组遍历的首选方式,安全直观、不改变内部指针;关联数组必须用foreach($arr as $key => $value);禁用已废弃的each()和while组合;for仅适用于连续数字索引数组。

foreach 循环是 PHP 数组遍历的首选方式
绝大多数情况下,用 foreach 遍历数组最安全、最直观,它自动处理索引和值,不改变原数组内部指针,也不依赖当前数组长度是否变化。
常见错误是强行用 for 配合 count() 遍历关联数组——这会出错,因为键名不一定是数字或连续的。
-
foreach ($arr as $value):只取值,适合只读操作 -
foreach ($arr as $key => $value):同时拿到键和值,处理关联数组必须这么写 - 遍历时不要在循环体内用
unset()删除当前元素,可能跳过下一个元素;如需过滤,先用array_filter() - 如果数组很大且只读,
foreach比for+count()略快,因为不用每次调用函数
while + each() 已被废弃,别再用了
each() 在 PHP 7.2+ 中已被移除,PHP 8 完全不可用。网上很多老教程还写 while (list($k, $v) = each($arr)),运行会直接报 Fatal error: Uncaught Error: Call to undefined function each()。
如果你维护旧代码遇到这个错误,必须替换成 foreach 或手动重写为 reset() + key() + current() + next() 组合——但真没必要,foreach 更简洁可靠。
for 循环只适用于数字索引且连续的数组
只有当你明确知道数组是「从 0 开始、键连续、无空洞」的整数索引数组时,for 才可考虑。例如 range(0, 99) 这类生成的数组。
- 错误写法:
for ($i = 0; $i —— 若数组键是['a' => 1, 'b' => 2],会输出Notice: Undefined offset - 正确前提:先用
array_values($arr)重置键,再用for,但多此一举 -
count()在循环条件里每次执行,小数组无所谓,大数组建议提前存变量:$len = count($arr); for ($i = 0; $i
递归遍历多维数组要用 array_walk_recursive() 或自定义函数
普通 foreach 只能展开一层。遇到嵌套数组(比如 JSON 解析后的结构),需要递归访问每个叶子节点时,优先用内置函数 array_walk_recursive()。
它会自动跳过子数组,只对最终的标量值(string/int/bool/null)执行回调:
array_walk_recursive($data, function($value, $key) {
if ($key === 'id') {
echo "Found ID: $value\n";
}
});
注意:array_walk_recursive() 不传引用,改不了原值;要修改深层值,得自己写递归函数,用 &$item 引用传参,否则赋值无效。
多维数组的键名容易丢失上下文,实际调试时建议配合 print_r($item, true) 打印完整路径,而不是只看当前层的 $key。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











