登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  php教程

PHP array_first 和 array_last 遇到空数组返回什么

来源:17golang原创

时间:2026-09-12 12:56:09 367浏览 收藏

PHP 8.5 的 array_first()array_last() 遇到空数组时,返回值都是 null。它们不会抛出“没有第一个元素”的异常,也不会凭空返回 0 下标。实际使用时要记住:空数组返回的 null,和数组里恰好存放一个 null,是两个不同的业务情况。

官方地址:https://www.php.net/docs.php

如果只需要一个可继续参与业务判断的首项或末项,可以直接接收 null;如果必须区分“没有元素”和“元素值就是 null”,就要先判断数组是否为空。
要点速览
  • array_first([])array_last([]) 都返回 null
  • PHP 8.5 才提供这两个内置函数;旧版本应使用显式兼容写法。
  • ?? 适合给空数组结果补默认值,但不能用来区分空数组和有效的 null 元素。

空数组的结果很明确,但不能当成下标问题

这两个函数取的是“按插入顺序排列的第一个值”和“最后一个值”,不是读取 $array[0] 或假定最后一个键是连续整数。因此关联数组、从 1 开始的数组和键名不连续的数组,都不影响它们的取值顺序。数组为空时没有可返回的值,统一得到 null

PHP array_first 和 array_last 处理非空数组与空数组的返回边界示意图
图1:操作示意图。函数先沿数组的首项或末项取值,空数组分支统一落到 null。

例如:

 '订单已创建', 'last' => '等待发货'];

// 空数组没有首项或末项,两个函数都返回 null。
var_dump(array_first($empty)); // NULL
var_dump(array_last($empty));  // NULL

// 关联键不改变“第一个/最后一个值”的顺序语义。
var_dump(array_first($items)); // string(12) "订单已创建"
var_dump(array_last($items));  // string(12) "等待发货"

真正容易踩坑的是 null 值,而不是函数本身

考虑这两组数据:[] 表示没有记录,['status' => null] 表示有一条记录但状态为空。对两者调用 array_first(),结果都可能是 null。所以需要把“数组有没有元素”和“取出的值是不是 null”拆成两个判断。

 null]), PHP_EOL;

PHP 8.5 和旧版本的选择边界

PHP 8.5 中优先用内置函数,表达式短且不会移动数组内部指针。项目仍支持 PHP 8.4 或更早版本时,可以把兼容逻辑集中在一个小函数里,不要在业务代码里反复写取键和空数组判断。

PHP 8.5 内置函数与旧版本 array_key_first 和 array_key_last 兼容方案对比示意图
图2:结果示意图。PHP 8.5 直接取得值,旧版本先拿边界键再读取,空数组分支仍返回 null。

如果调用方只需要展示文案,?? 很方便:$label = array_first($items) ?? '暂无状态';。但它会把“没有元素”和“首项明确为 null”都归并为默认文案,所以审计、结算、状态机等场景应保留前面的空数组判断。

把返回值放进业务流程前,先选对策略

我的经验是:展示层可以直接使用默认值,领域层最好返回更明确的状态。对比起来,PHP 8.5 内置函数适合新项目和已完成版本升级的项目;兼容函数适合公共库或仍需支持旧运行环境的项目;而“直接访问 $items[0]”只适用于明确保证连续零起始索引的内部数组。

场景推荐写法注意点
PHP 8.5 新代码array_first($items)空数组得到 null
兼容 PHP 8.4 及更早版本空判断 + array_key_first不要省略空数组分支
页面默认文案array_last($items) ?? '暂无'会合并两种 null 语义

相关问题

array_first([]) 会返回 0 吗?

不会。返回的是 null,因为空数组没有值。只有在业务代码主动使用默认值时,才可能通过 ?? 0 得到整数 0。

数组里有 null 时怎么判断它是否真的存在?

先用 $items !== [] 确认数组有元素,再取首值;如果要判断某个键是否存在且值允许为 null,使用 array_key_exists(),不要只用 isset()

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>