当前位置:首页 > 文章列表 > 文章 > php教程 > PHP array_is_list 怎么识别连续数字索引

PHP array_is_list 怎么识别连续数字索引

来源:17golang原创 2026-10-04 08:02:40 0浏览 收藏

处理 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。

PHP array_is_list 检查从零开始连续键与数组值的静态结构图
图1:结构说明图,查看数组键序列、值容器和 array_is_list 判断边界之间的关系。

二、用 array_is_list 覆盖常见输入

把判断集中在一个小表格里,比只记住“索引数组返回 true”更可靠:

输入结构键序列结果
空数组无键true
连续列表0、1、2true
起点非零1、2false
存在缺口0、2false
混合键0、namefalse

下面的示例刻意把边界放在同一个数组中,便于接口测试直接复用。代码只输出判断结果,不把输出当成运行截图;它表达的是函数契约:

 [],
    '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 稀疏数组重建列表与接口数据契约边界的静态关系图
图2:边界说明图,查看过滤结果、原键保留、array_values 重建和接口契约之间的静态关系。

四、兼容 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 会不会改变原数组?

不会。它返回一个重新编号的新数组;是否用新数组替换原变量,应由业务是否依赖原键来决定。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
photocolors适合手机还是电脑?网页端使用环境与照片处理说明photocolors适合手机还是电脑?网页端使用环境与照片处理说明
上一篇
photocolors适合手机还是电脑?网页端使用环境与照片处理说明
Go hmac.Equal 怎么比较消息认证码
下一篇
Go hmac.Equal 怎么比较消息认证码
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    324次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    382次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    376次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    340次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    166次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码