prev() 不是独立遍历工具,必须配合数组内部指针使用;它仅将指针回退一位并返回新位置值,不检查越界,返回 false 或合法 falsy 值,判断须用 ===,不可用于对象且不适用于 foreach 或键名定位。

prev() 不是独立遍历工具,它必须配合数组内部指针状态使用;单独调用几乎没意义,还容易踩空指针或误判 false。
prev() 必须和 current()、next() 等指针函数协同工作
PHP 数组内部有一个“隐藏指针”,prev() 的作用只是把这根指针往回挪一位,然后返回新位置的值。它不关心你当前在哪、有没有初始化、甚至不检查是否越界——只机械执行“倒退一步”。
- 如果指针原本就在第一个元素上,
prev()会移到数组开头之前,返回false - 如果数组为空,或刚用
reset()重置过,prev()第一次调用必返回false - 它不会自动跳过空值或
0,遇到0、""、null都可能返回这些值,而它们和false在松散比较中等价
判断 prev() 返回值必须用 ===,不能用 ==
因为 prev() 可能返回 false(指针越界),也可能返回 0、"" 或 null(合法数组元素)。用 == false 会把所有“falsy 值”都当成失败,导致逻辑错误。
正确写法:
$arr = [0, 'a', 'b'];
reset($arr); // 指针到 0
next($arr); // 指针到 'a'
$prevVal = prev($arr); // 回到 0
if ($prevVal === false) {
echo "指针已超出开头";
} else {
echo "上一个值是: " . var_export($prevVal, true);
}
常见误用:把它当“取上一个索引元素”的工具
很多人想用 prev() 实现类似 “已知当前键,找前一个键的值”,但这是错的。它依赖的是**当前指针位置**,不是当前键名或索引。
- 如果你用
foreach遍历,内部指针不被修改,prev()完全无效 - 如果你用
key($arr)得到当前键,再手动算$keys[array_search($currentKey, $keys) - 1],那比prev()更可靠 - 对关联数组,
prev()倒退的是**内部哈希表顺序**,不一定是定义顺序(尤其 PHP 7.4+ 后哈希表优化更激进)
PHP 8.1+ 开始,别在对象上调用 prev()
文档明确标记 prev() 在 object 上调用已被弃用。即使对象实现了 ArrayAccess 或有 public 属性,也不能直接传进去。
- 报错示例:
prev($obj)→Deprecated: prev(): Passing object to prev() is deprecated - 替代方案:先转成数组,比如
prev((array) $obj)(仅适用于简单对象),或用get_mangled_object_vars($obj) - 更健壮的做法:让对象实现
Iterator,用ArrayIterator包装后操作
真正难的不是怎么调用 prev(),而是搞清你到底需要什么:是按顺序来回扫数组?还是根据某个 key 查相邻项?前者才轮得到它,后者基本该换思路。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











