最推荐用 array_key_last() + [] 组合(PHP 7.3+),无副作用;次选 end()(会移动内部指针);兼容老版本可用 array_keys() + count();禁用 array_pop()(会修改原数组)。

用 end() 函数最直接,但会移动内部指针
end() 是 PHP 原生获取数组末尾元素的最快方式,它直接返回最后一个值,不用计算长度或键名。
但它有个副作用:会把数组的内部指针移到末尾。如果后续还要用 foreach 或 current()、next() 等函数遍历,结果可能出人意料。
- 适用于一次性读取,不依赖指针位置的场景(比如日志数组取最新一条)
- 对空数组返回
FALSE,记得用=== FALSE判断,避免和值为0或''的合法元素混淆 - 关联数组、索引数组都支持,不关心键类型
示例:
$arr = ['a' => 1, 'b' => 2, 'c' => 3];<br>echo end($arr); // 输出 3<br>echo current($arr); // 输出 3(不是 1!指针已偏移)
用 array_key_last() + [] 组合更安全(PHP 7.3+)
如果你用的是 PHP 7.3 或更高版本,array_key_last() 能拿到最后一个键,再配合方括号取值,完全不干扰内部指针。
立即学习“PHP免费学习笔记(深入)”;
这是目前最推荐的“无副作用”方案,尤其适合需要多次读取或后续还要遍历的逻辑。
- 空数组时
array_key_last()返回NULL,直接用$arr[array_key_last($arr)]会触发 Notice,得先判断 - 只支持一维数组;嵌套数组得自己递归或用其他方式
- 比
end()多一次函数调用,但性能差异可忽略
示例:
if (($lastKey = array_key_last($arr)) !== NULL) {<br> $last = $arr[$lastKey];<br>}用 count() 和 array_keys() 兼容老版本 PHP
PHP 7.3 之前没有 array_key_last(),常见 fallback 是先算长度,再取最后一个键——但要注意索引数组和关联数组的区别。
count($arr) - 1 只对连续数字索引有效;一旦中间有缺失(如 [0,1,3]),就会越界或取错。
- 稳妥做法是先用
array_keys($arr)拿所有键,再用count() - 1取最后一个键名 - 性能略差(生成新数组),但兼容性最好(PHP 4+ 都行)
- 注意:
array_keys()对空数组返回空数组,取[count(...) - 1]会报 Warning
示例:
$keys = array_keys($arr);<br>if (!empty($keys)) {<br> $last = $arr[$keys[count($keys) - 1]];<br>}
别用 array_pop(),除非你真想删掉它
array_pop() 确实返回最后一个元素,但它会**修改原数组**——弹出并销毁该元素。很多人误以为它是只读操作,结果导致后续逻辑数据异常。
这个函数的设计意图就是“出栈”,不是“查看栈顶”。哪怕你立刻用 array_push() 补回去,也多了一次写操作,还可能破坏键顺序(尤其关联数组)。
- 仅在明确要移除末尾项时才用
- 对引用传递的数组影响更大,容易引发隐蔽 bug
- 性能上比
end()或array_key_last()差,因为涉及结构变更
真正麻烦的不是选哪个函数,而是没意识到 PHP 数组内部指针的存在,或者默认数组一定是数字索引。这两个假设在真实项目里崩得最多。



















