PHP array_is_list 怎么识别连续数字索引
处理 JSON 入参或批量参数时,PHP 数组“看起来像列表”并不等于它真的具备列表结构。判断关键不在值是不是字符串或数字,而在键是否严格从 0 开始连续递增。PHP 8.1 起可以直接调用 array_is_list();空数组返回 true,键缺号、乱序或混入字符串键则返回 false。
官方文档:https://www.php.net/manual/en/function.array-is-list.php
array_is_list()检查的是键结构,不是值类型。- 列表必须从 0 开始,直到
count($array) - 1,顺序也不能乱。 - 需要把稀疏数组变成列表时先用
array_values(),不要只改变量名。
一、先把“连续数字索引”说准确
PHP 的普通数组既能当列表,也能当字典。下面四组数据的值都很普通,但键结构完全不同:['red', 'blue'] 的键是 0、1;[1 => 'red', 2 => 'blue'] 从 1 开始;[0 => 'red', 2 => 'blue'] 中间缺少 1;[0 => 'red', 'name' => 'blue'] 混入了字符串键。只有第一组满足 list 的定义。
可以把判断规则记成:对长度为 n 的数组,键集合必须正好是 0, 1, 2, ..., n-1,并且迭代顺序与这个序列一致。值可以重复,也可以是数组或对象;值本身不会让结果变成 false。

二、用 array_is_list 覆盖常见输入
把判断集中在一个小表格里,比只记住“索引数组返回 true”更可靠:
| 输入结构 | 键序列 | 结果 |
|---|---|---|
| 空数组 | 无键 | true |
| 连续列表 | 0、1、2 | true |
| 起点非零 | 1、2 | false |
| 存在缺口 | 0、2 | false |
| 混合键 | 0、name | false |
下面的示例刻意把边界放在同一个数组中,便于接口测试直接复用。代码只输出判断结果,不把输出当成运行截图;它表达的是函数契约:
[],
'normal' => ['red', 'blue', 'green'],
'starts-at-one' => [1 => 'red', 2 => 'blue'],
'has-gap' => [0 => 'red', 2 => 'green'],
'mixed-key' => [0 => 'red', 'name' => 'blue'],
];
foreach ($samples as $label => $value) {
// array_is_list 只判断键是否连续,不会检查值的业务含义。
printf("%s: %s\n", $label, array_is_list($value) ? 'list' : 'map');
}
?>
实际调用时不要用 array_keys($value) === range(...) 代替它作为默认写法:那种表达式会额外创建键数组,并且空数组、类型比较和边界处理都需要调用方自己维护。PHP 8.1 以上直接使用内置函数,意图更清楚。
三、需要列表语义时先重建键
array_is_list() 只负责回答“现在是不是列表”,不会替你修复数组。如果业务允许丢弃原键,可以用 array_values() 生成新的 0 起始序列;如果原键有业务含义,则应该保留关联数组,不要为了让检查通过而重建。
'red', 2 => 'green'];
if (!array_is_list($filtered)) {
// 这里明确表示放弃原键,只保留顺序和值。
$list = array_values($filtered);
} else {
$list = $filtered;
}
var_dump($list); // 结果结构为 ['red', 'green'],新键是 0、1。
?>
这一步常见于 array_filter() 之后:过滤函数会保留原键,所以结果可能仍然是稀疏数组。若数据要进入只接受列表的 JSON 契约,重建键应当是显式决策,而不是隐藏在通用工具函数里。

四、兼容 PHP 8.1 以下的运行环境
官方函数从 PHP 8.1 开始提供。如果项目还要支持更早版本,可以用一次遍历的兼容函数,但要把它放在兼容层,并保持与内置函数同样的空数组语义:
$_value) {
// 严格比较可区分整数键和看似相同的字符串键。
if ($key !== $expected) {
return false;
}
$expected++;
}
return true;
}
?>
新项目不必重复维护这段兼容逻辑;只有最低 PHP 版本确实低于 8.1 时才保留。无论使用哪个实现,都要在接口边界写清楚“空列表是否允许、关联对象是否允许、过滤后是否自动重建”,这样调用方得到的是稳定的数据契约。
相关问题
值是数字数组,为什么仍可能返回 false?
函数看的是键,不是值。只要键从 1 开始、存在缺口、顺序错乱或混入字符串键,就不符合 list 定义。
空数组算不算列表?
算。空数组没有违反“从 0 到 count-1 连续”的条件,因此 array_is_list([]) 返回 true。
array_values 会不会改变原数组?
不会。它返回一个重新编号的新数组;是否用新数组替换原变量,应由业务是否依赖原键来决定。
photocolors适合手机还是电脑?网页端使用环境与照片处理说明
- 上一篇
- photocolors适合手机还是电脑?网页端使用环境与照片处理说明
- 下一篇
- Go hmac.Equal 怎么比较消息认证码
-
- 文章 · php教程 | 3小时前 |
- PHP BackedEnum::from 与 tryFrom 怎么选择
- 335浏览 收藏
-
- 文章 · php教程 | 9小时前 | php教程 · PHP 8.4 ·
- PHP 8.4 从隐式可空参数迁移类型声明的方法
- 481浏览 收藏
-
- 文章 · php教程 | 2天前 | JSON · api设计 · php教程 · php json_encode JsonSerializable JSON_THROW_ON_ERROR jsonSerialize
- PHP JsonSerializable 控制对象输出字段
- 129浏览 收藏
-
- 文章 · php教程 | 2天前 | 内存优化 · php教程 · php 文件上传 php://input stream_filter php_user_filter
- PHP stream_filter 处理上传内容的分段方式
- 292浏览 收藏
-
- 文章 · php教程 | 5天前 |
- PHP Lazy Objects 延迟初始化实体的状态边界
- 409浏览 收藏
-
- 文章 · php教程 | 5天前 |
- PHP Attributes 扫描控制器元数据的缓存方法
- 357浏览 收藏
-
- 文章 · php教程 | 5天前 |
- PHP Enum 映射数据库值的类型安全方案
- 278浏览 收藏
-
- 文章 · php教程 | 5天前 | php教程 · php Fiber 事件循环 非阻塞I/O Fiber::suspend Fiber::resume
- PHP Fiber 在阻塞 I/O 封装中的调度边界
- 176浏览 收藏
-
- 文章 · php教程 | 5天前 |
- PHP DateTimeImmutable 按时区转换并保持原对象
- 485浏览 收藏
-
- 文章 · php教程 | 5天前 | PHP · 日期时间 · php 时区 DateTimeImmutable createFromInterface
- PHP DateTimeImmutable createFromInterface 怎么保留时区
- 201浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 324次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 382次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 376次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 340次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 166次使用
-
- 三种Golang数组拷贝方式及性能分析详解
- 2023-01-28 402浏览
-
- go语言中切片Slice与数组Array对比以及panic: runtime error: index out of range问题解决
- 2023-01-28 222浏览
-
- 详解Go语言中数组,切片和映射的使用
- 2023-01-20 198浏览
-
- golang数组内存分配原理
- 2023-01-10 335浏览
-
- golang数组去重,利用map的实现
- 2023-01-07 297浏览

