foreach最常用,但需用&引用修改原数组元素并unset($value)避免副作用;for仅适用于连续数字索引数组,不推荐通用遍历。

foreach 循环最常用,但要注意引用赋值的副作用
绝大多数 PHP 数组遍历场景直接用 foreach 就行,它自动处理索引和关联两种数组,无需手动维护指针。但容易忽略的是:如果在循环中想修改原数组元素,必须显式加引用符号 &,否则修改的是副本。
- 正确写法:
foreach ($arr as &$value) { $value .= '_modified'; }—— 原数组被改 - 错误写法:
foreach ($arr as $value) { $value .= '_modified'; }—— 原数组不变 - 循环结束后记得
unset($value),否则后续代码中$value仍持有最后一个元素的引用,可能意外覆盖数据
for 循环只适合数字索引数组,且需提前确认 count()
for 在 PHP 中并不推荐用于通用数组遍历,因为它依赖连续整数下标。一旦数组键被重排(比如用 unset() 删除中间元素)、或本身就是关联数组,for ($i = 0; $i 会跳过或报错。
- 仅当明确知道是「从 0 开始、无空洞、纯数字键」的数组时才考虑
for -
count($arr)不要放在循环条件里反复调用,尤其大数组——先存到变量里:$len = count($arr); for ($i = 0; $i - 访问元素必须用
$arr[$i],不能用$arr[$i]['key']这类嵌套写法,除非你确定每项都是数组且结构一致
while + each() 已废弃,别再用
each() 函数在 PHP 7.2+ 被移除,PHP 8 完全不可用。如果你在老项目代码里看到 while (list($key, $value) = each($arr)),必须立刻替换。这不是兼容性问题,而是运行时直接报 Fatal error: Uncaught Error: Call to undefined function each()。
- 替代方案只有
foreach或手动重置内部指针后用key()/current()/next() - 手动指针操作极容易出错,比如忘记
reset($arr)导致从中间开始遍历,不建议日常使用
遍历多维数组时,递归 vs 循环选择看需求
面对二维及以上数组,是否需要“扁平化”所有值,决定了写法。简单展开用嵌套 foreach;深度不确定或结构动态,则用递归函数更稳。
- 两层固定结构:
foreach ($arr as $row) { foreach ($row as $cell) { echo $cell; } } - 任意深度递归示例:
function walk_array($arr) { foreach ($arr as $v) { if (is_array($v)) walk_array($v); else echo $v; } } - 注意递归深度限制,默认 100 层,超深数组会触发
Fatal error: Maximum function nesting level,可调xdebug.max_nesting_level,但更应检查数据是否异常嵌套
foreach 就够了;剩下 5% 要么是结构太深,要么是得边遍历边删元素——后者必须用 for 倒序或 array_filter() 替代,正向 foreach 中 unset() 会导致跳过下一个元素。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











