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) {` ?」... 這是一個好問題!事實證明,`++$i;if($k!==$i){...}` 在 PHP7 上比 `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