
直接用 end() 会改指针,空数组返回 false,不加判断容易出 bug。
调用 end() 前必须传变量,不能传表达式或字面量
PHP 的 end() 要求参数是「可修改的变量」(即按引用传递),所以它拒绝临时值。
-
end($arr)✅ 正常工作 -
end(['a','b','c'])❌ 报 Warning:Only variables can be passed by reference -
end(explode(',', $str))❌ 同样报错,explode()返回的是临时数组
正确写法是先赋值再调用:
$parts = explode(',', $str);
$last = end($parts);
空数组时 end() 返回 false,弱比较极易误判
比如 if (end($arr) == 'x'):当 $arr 为空时,end($arr) 返回 false,而 false == 'x' 在 PHP 中为 true(字符串转布尔后为 true,但 false == '' 才是 true —— 实际上这里会触发类型转换陷阱,结果不可靠)。
- 永远用严格比较:
$last = end($arr); if ($last !== false && $last === 'x') { ... } - 更稳妥的做法是提前检查:
if (!empty($arr)) { $last = end($arr); ... }
获取最后一个键名?别只用 end(),搭配 key() 或换 array_key_last()
end() 只返回值,不提供键。想拿最后一个键,常见两种方式:
- 先移动指针再取键:
end($arr); $lastKey = key($arr);—— 但会改指针,后续若还要遍历需reset($arr) - PHP 7.3+ 推荐用
array_key_last():$lastKey = array_key_last($arr); $lastVal = $arr[$lastKey] ?? null;—— 零副作用、不改指针、线程安全
注意:array_key_last() 对空数组返回 null,比 end() 的 false 更易区分边界情况。
end() 和 array_slice($arr, -1)[0] 性能差多少?
在百万级元素数组上实测,end() 平均耗时约是 array_slice($arr, -1)[0] 的一半 —— 因为前者只是移动内部指针,后者要分配新数组内存并复制一个元素。
- 日常小数组,差异可忽略
- 高频调用或大数据场景,优先选
end()(但务必配空数组检查) - 若你已在用
array_slice(),记得加[0]取值,否则得到的是单元素数组
真正容易被忽略的不是性能,而是指针状态残留:一次 end() 可能让后续 current()、next() 行为意外偏移,尤其在函数复用或协程环境中。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











