PHP 8.1引入array_is_list()函数,用于判断数组键是否为从0开始的连续整数,空数组视为列表,非连续或非整数键则不是,此前版本需手动遍历判断。

在PHP中,要检查一个数组是否是“连续”的列表,即其键是否为从0开始的连续整数(0, 1, 2...),最直接且推荐的方法是使用PHP 8.1引入的
array_is_list()
PHP 8.1及更高版本提供了一个非常方便的内置函数
array_is_list()
array_is_list()
count($array) - 1
[]
我们来看几个例子:
立即学习“PHP免费学习笔记(深入)”;
<?php // 这是一个标准的列表数组,键从0开始连续 $listArray1 = ['apple', 'banana', 'cherry']; var_dump(array_is_list($listArray1)); // 输出: bool(true) // 显式指定0, 1, 2键,效果相同 $listArray2 = [0 => 'red', 1 => 'green', 2 => 'blue']; var_dump(array_is_list($listArray2)); // 输出: bool(true) // 空数组被认为是列表 $emptyArray = []; var_dump(array_is_list($emptyArray)); // 输出: bool(true) // 键不是从0开始,即使是连续的,也不是列表 $notListArray1 = [1 => 'first', 2 => 'second']; var_dump(array_is_list($notListArray1)); // 输出: bool(false) // 键中间有跳跃,也不是列表 $notListArray2 = [0 => 'itemA', 2 => 'itemC']; var_dump(array_is_list($notListArray2)); // 输出: bool(false) // 包含非整数键的数组,肯定不是列表 $assocArray = ['name' => 'Alice', 'age' => 30]; var_dump(array_is_list($assocArray)); // 输出: bool(false) // PHP在创建数组时会自动分配连续的数字键,所以这个也是列表 $mixedCreation = [0 => 'value0', 'value1', 2 => 'value2']; var_dump(array_is_list($mixedCreation)); // 输出: bool(true) // 内部其实是 [0 => 'value0', 1 => 'value1', 2 => 'value2'] ?>
array_is_list()
在PHP 8.1之前,由于没有
array_is_list()
通常,我们会编写一个辅助函数来完成这项任务。核心思路是遍历数组的键,检查它们是否从0开始,并且是连续递增的。
以下是一个在PHP 8.1之前可以使用的判断函数:
<?php
/**
* 判断一个数组是否为连续的、从0开始的整数键列表(PHP 8.1-兼容)
*
* @param array $arr 待检查的数组
* @return bool 如果是列表则返回 true,否则返回 false
*/
function is_list_pre_php81(array $arr): bool
{
// 空数组被认为是列表
if (empty($arr)) {
return true;
}
$expectedKey = 0;
foreach ($arr as $key => $value) {
// 检查当前键是否与预期键匹配
// 如果键不是整数,或者不等于预期值,那么它就不是一个列表
if ($key !== $expectedKey) {
return false;
}
$expectedKey++; // 预期下一个键递增
}
return true; // 所有键都符合预期
}
// 测试一下这个函数
var_dump(is_list_pre_php81(['apple', 'banana'])); // true
var_dump(is_list_pre_php81([0 => 'red', 1 => 'green'])); // true
var_dump(is_list_pre_php81([1 => 'first', 2 => 'second'])); // false (键不是从0开始)
var_dump(is_list_pre_php81(['name' => 'Alice'])); // false (非整数键)
var_dump(is_list_pre_php81([])); // true
var_dump(is_list_pre_php81([0 => 'a', 2 => 'c'])); // false (键不连续)
?>这个
is_list_pre_php81
$expectedKey
false
在PHP中,数组的灵活性是其一大特色,它既可以作为有序的列表(索引数组),也可以作为键值对的映射(关联数组)。但这种灵活性有时也会带来一些模糊性,尤其是在数据交换和API设计中。明确区分“列表”和“关联数组”至关重要,这主要体现在以下几个方面:
json_encode()
[]
{}count-1
json_encode()
['a', 'b']
["a", "b"]
json_encode()
[1 => 'a', 2 => 'b']
{ "1": "a", "2": "b" }array_is_list()
json_encode()
我个人在调试一些与前端或外部API交互的系统时,就经常遇到因为PHP数组的“列表性”判断不准,导致
json_encode
array_is_list()
array_is_list()
is_array()
在PHP中,关于数组的判断函数有很多,它们各有侧重,解决的问题也不同。理解它们之间的差异对于编写健壮的代码至关重要。
is_array()
array
true
var_dump(is_array([1, 2, 3])); // true
var_dump(is_array(['name' => 'Alice'])); // true
var_dump(is_array(new ArrayObject())); // false (这是一个对象,不是原生数组)
var_dump(is_array('hello')); // false所以,
is_array()
array_is_list()
array_is_list()
is_array()
array_is_list($arr)
true
is_array($arr)
true
array_is_list()
$arr1 = [0 => 'a', 1 => 'b']; var_dump(is_array($arr1)); // true var_dump(array_is_list($arr1)); // true $arr2 = [1 => 'a', 2 => 'b']; var_dump(is_array($arr2)); // true var_dump(array_is_list($arr2)); // false (键不从0开始)
其他相关数组判断函数
empty()
count($arr)
empty($arr)
true
[]
is_array()
true
array_is_list()
true
empty()
true
isset()
null
isset($arr['key'])
null
array_key_exists()
null
isset()
isset()
null
false
array_key_exists()
true
count()
sizeof()
array_keys()
array_is_list()
PHP的数组是其最强大的特性之一,它灵活得像个瑞士军刀,既能做列表又能做映射。而
array_is_list()
以上就是如何在PHP中检查数组是否连续?array_is_list()的判断方法的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号