应直接替换为foreach循环,因PHP 8.1已彻底移除each()函数,调用将触发Fatal error;PHP 7.2起deprecated,7.4警告,8.0起完全删除,无兼容回退。

直接替换为 foreach 循环,这是最稳妥、最推荐的做法。PHP 8.1 已彻底移除 each(),调用会触发 Fatal error: Uncaught Error: Call to undefined function each(),无法绕过或兼容。
为什么不能保留 or 临时兼容
each() 在 PHP 7.2 就被标记为 deprecated,7.4 仅保留但已警告,8.0 起完全删除——8.1 不再提供任何回退机制。试图用 @each() 或条件判断版本号都无效,函数本身不存在。
标准替换写法
原 PHP 7.4 常见用法:
$arr = ['a' => 1, 'b' => 2];
while ($item = each($arr)) {
echo $item['key'] . ': ' . $item['value'] . "\n";
}
替换成:
立即学习“PHP免费学习笔记(深入)”;
- 遍历键值对(推荐):
foreach ($arr as $key => $value) { echo "$key: $value\n"; } - 只遍历值:
foreach ($arr as $value) { echo "$value\n"; } - 需要手动控制指针(极少见):改用
reset()+key()+current()+next()组合,但强烈不建议——逻辑复杂且易出错
特别注意嵌套和引用场景
如果原代码在 while(each()) 中修改了数组(如 unset()),foreach 默认遍历的是快照,行为不同。此时需明确意图:
- 若只是读取,
foreach安全可靠 - 若需边遍历边删元素,改用
array_keys()提前获取键名再循环:foreach (array_keys($arr) as $key) { if (some_condition($arr[$key])) unset($arr[$key]); }
批量扫描与替换建议
项目中可能有多处 each(),别靠肉眼搜。可用以下命令快速定位:
grep -r "each(" . --include="*.php" | grep -v "vendor/"
找到后统一按上述规则替换。注意检查是否在字符串里误匹配(如注释或 SQL 字符串),避免误改。



















