(PHP 8 >= 8.1.0)
array_is_list — Vérifie si un array
donné est une liste
Détermine si l'array
donné est une liste.
Un tableau est considéré comme une liste si ses clés sont constituées de nombres consécutifs
de 0
à count($array)-1
.
Exemple #1 Exemple de array_is_list()
<?php
var_dump(array_is_list([])); // true
var_dump(array_is_list(['apple', 2, 3])); // true
var_dump(array_is_list([0 => 'apple', 'orange'])); // true
// Le tableau ne commence pas à 0
var_dump(array_is_list([1 => 'apple', 'orange'])); // false
// Les clés ne sont pas dans le bon ordre
var_dump(array_is_list([1 => 'apple', 0 => 'orange'])); // false
// Clés non entières
var_dump(array_is_list([0 => 'apple', 'foo' => 'bar'])); // false
// Clés non consécutives
var_dump(array_is_list([0 => 'apple', 2 => 'bar'])); // false
?>
Note:
Cette fonction retourne
true
pour les tableaux vides.
Polyfills that call `array_keys()`, `array_values()` or `range()` are inefficient because they create new arrays unnecessarily.
Please use this polyfill instead which creates no new arrays and only does a single pass over the given array.
<?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;
}
}
?>
slightly optimized version of phpnet at jesseschalken dot com's excellent 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;
}
}
?>
benchmarks: https://3v4l.org/9BPqL
why is this faster you ask? because post-increment does more,
here is what pre-increment actually means:
step 1: increment the value by 1.
step 2: return the value.
here is what post-increment actually means:
step 1: create a copy of the original value.
step 2: increment the original value by 1.
step 3: return the copy.
another question might be "why didn't you write `if ($k !== ++$i) {` ? ... that is a good question! turns out that ++$i;if($k!==$i){...} is faster on PHP7 than if($k !== ++$i){...} for reasons unknown to me.. (if you have an answer, feel free to email me about it!)
(i have NOT checked if PHP8/jit auto-optimize this stuff, but at least back in PHP7 it's true that pre-increment is faster than post-increment, and this polyfill is primarily for PHP7)
Polyfill implementation for PHP versions lower than 8.1.
<?php
if (!function_exists('array_is_list'))
{
function array_is_list(array $a)
{
return $a === [] || (array_keys($a) === range(0, count($a) - 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;
}
these two function is more faster than divinity76+spam at gmail dot com's about three times in my computer for PHP 8.2.9:
array(3) {
["pre"]=>
float(0.8179779052734375)
["post"]=>
float(0.8116860389709473)
["index"]=>
float(0.3369460105895996)
}
:)
old school 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);
}
}
?>