PHP Conference Japan 2024

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

参见

添加注释

用户贡献的注释 6 条注释

50
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;
}
}

?>
23
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)
14
Matteo Galletti
3 年前
低于 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));
}
}
?>
-1
2317216477 at qq dot com
1 个月前
function isIndexed($array)
{
if (is_array($array)) {
$keys = array_keys($array);
return $keys === array_keys($keys);
}
return false;
}

function isAssoc($array)
{
if (is_array($array)) {
$keys = array_keys($array);
return $keys !== array_keys($keys);
}
return false;
}

在我的电脑上,对于 PHP 8.2.9,这两个函数比 divinity76+spam at gmail dot com 的函数快大约三倍

array(3) {
["pre"]=>
float(0.8179779052734375)
["post"]=>
float(0.8116860389709473)
["index"]=>
float(0.3369460105895996)
}

:)
1
info at ensostudio dot ru
3 年前
老式 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);
}
}
?>
0
maruerru
1 年前
我认为,这是最快的 Polyfill

<?php

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

?>
To Top