each() 在 PHP 8.0 中被彻底移除,唯一合规解法是改用 foreach 或 ArrayIterator 等替代方案,需根据原逻辑选择:纯遍历用 foreach,需单步控制用封装函数,依赖指针状态则用 ArrayIterator。

PHP 8.0 报错 Uncaught Error: Call to undefined function each() 怎么办
直接结论:each() 在 PHP 8.0 中被彻底移除,不是弃用警告,是直接不可用。别试兼容层或降级,唯一合规解法是改用 foreach 或其他迭代方式。
为什么不能简单替换为 foreach($arr as $k => $v)
each() 的关键行为是「每次调用返回当前指针位置的键值对,并将内部指针前移一位」,常被用于 while 循环中手动控制遍历节奏(比如跳过某些项、中途 break 后继续)。而 foreach 默认重置数组指针、不暴露当前指针位置,两者语义不同。
常见踩坑场景:
- 原代码用
while ($item = each($arr)) { ... }实现边遍历边修改数组(如 unset 当前项),foreach会因指针不可控导致跳项或重复处理 - 依赖
each()返回格式:array(4) { ["key"]=> string(1) "a" ["value"]=> int(1) [0]=> string(1) "a" [1]=> int(1) },直接套foreach拿不到这种结构 - 在函数内多次调用
each()分段读取大数组,指望复用同一个数组引用 ——foreach每次都从头开始
三种安全迁移方案及适用条件
根据原始逻辑选择:
立即学习“PHP免费学习笔记(深入)”;
- 如果只是「遍历输出」且不修改数组:直接用
foreach($arr as $k => $v),最简也最安全 - 如果需模拟
each()的「单步推进+返回完整结构」:写个轻量封装函数,例如:function php8_each(&$arr) { $key = key($arr); if ($key === null) return false; $val = current($arr); next($arr); return [$key, $val, 'key' => $key, 'value' => $val]; }注意必须传引用&$arr,否则指针操作无效 - 如果原逻辑依赖指针状态(如分批处理、中断恢复):改用
ArrayIterator,它显式暴露valid()/current()/key()/next()方法,可控性最强
检查是否还有隐藏的 each() 调用
第三方库或老模板里可能藏着没被发现的 each(),尤其 WordPress 插件、早期 Smarty 模板、自定义分页工具类。不要只搜文件里的 each(,还要注意:
- 是否用了
create_function()动态拼接字符串调用(PHP 7.2+ 已废除,但旧代码可能残留) - Composer 包是否锁在 PHP 7.x 版本(
composer show vendor/package查版本,再看其composer.json的php约束) - 错误日志里是否出现
Undefined function each但堆栈指向vendor/下某文件 —— 那得升级对应包或打补丁
真正麻烦的从来不是那几行 foreach 替换,而是某个深埋的 each() 调用让整个数据流在 PHP 8.0 下静默错位,指针偏移一格,后续所有索引全乱。



















