array_is_list

(PHP 8 >= 8.1.0)

array_is_list检查给定 array 是否为列表

描述

array_is_list(array $array): bool

确定给定的 array 是否为列表。如果 array 的键由从 0count($array)-1 的连续数字组成,则认为它是一个列表。

参数

array

要评估的 array

返回值

如果 array 是列表,则返回 true,否则返回 false

示例

示例 #1 array_is_list() 示例

<?php

array_is_list
([]); // true
array_is_list(['apple', 2, 3]); // true
array_is_list([0 => 'apple', 'orange']); // true

// 数组不从 0 开始
array_is_list([1 => 'apple', 'orange']); // false

// 键顺序不正确
array_is_list([1 => 'apple', 0 => 'orange']); // false

// 非整数键
array_is_list([0 => 'apple', 'foo' => 'bar']); // false

// 非连续键
array_is_list([0 => 'apple', 2 => 'bar']); // false
?>

注释

注意:

此函数在空数组上返回 true

参见

添加注释

用户贡献的注释 5 个注释

phpnet at jesseschalken dot com
2 年前
调用 `array_keys()`、`array_values()` 或 `range()` 的 polyfill 效率低下,因为它们不必要地创建了新的数组。

请改用此 polyfill,它不会创建任何新的数组,并且只对给定数组进行单次遍历。

<?php

if (!function_exists("array_is_list")) {
function
array_is_list(array $array): bool
{
$i = 0;
foreach (
$array as $k => $v) {
if (
$k !== $i++) {
return
false;
}
}
return
true;
}
}

?>
divinity76+spam at gmail dot com
2 年前
phpnet at jesseschalken dot com 的优秀 array_is_list 的略微优化版本

<?php

if (!function_exists("array_is_list")) {
function
array_is_list(array $array): bool
{
$i = -1;
foreach (
$array as $k => $v) {
++
$i;
if (
$k !== $i) {
return
false;
}
}
return
true;
}
}

?>

基准测试:https://3v4l.org/9BPqL

你可能会问为什么它更快?因为后增量做了更多的事情。

以下是前增量的实际含义
步骤 1:将值增加 1。
步骤 2:返回值。

以下是后增量的实际含义
步骤 1:创建原始值的副本。
步骤 2:将原始值增加 1。
步骤 3:返回副本。

另一个问题可能是“为什么你不写 `if ($k !== ++$i) {`?... 这是一个好问题!事实证明,在 PHP7 中,`++$i;if($k!==$i){…}` 比 `if($k !== ++$i){…}` 更快,原因我也不知道。(如果你有答案,请随时给我发邮件!)

(我没有检查 PHP8/jit 是否自动优化了这些东西,但至少在 PHP7 中,前增量确实比后增量更快,而此 polyfill 主要用于 PHP7)
Matteo Galletti
2 年前
针对低于 8.1 的 PHP 版本的 polyfill 实现。

<?php
if (!function_exists('array_is_list'))
{
function
array_is_list(array $a)
{
return
$a === [] || (array_keys($a) === range(0, count($a) - 1));
}
}
?>
maruerru
11 个月前
我认为这是最快的 polyfill

<?php

if (!function_exists('array_is_list')) {
function
array_is_list(array $array)
{
return
$array === array_values($array);
}
}

?>
info at ensostudio dot ru
2 年前
老派 polyfill (
<?php
if (!function_exists('array_is_list')) {
function
array_is_list(array $array)
{
if (
$array === []) {
return
true;
}
$keys = array_keys($array);
return
$keys === array_keys($keys);
}
}
?>
To Top