PHP 8.1: функция array_is_list
При работе с массивами может наступить момент, когда вам понадобится проверить, является ли рассматриваемый массив списком
Итак, когда массив квалифицируется как «список» (list)?
Массив можно назвать списком, если ключи (должны быть в форме целого числа) являются последовательными. Это означает, что если массив является ассоциативным массивом с целочисленными ключами, он не должен иметь отсутствующих смещений массива или содержать неупорядоченные ключи.
Например, возьмем для примера следующее:
$bikes = [
0 => 'Honda',
1 => 'Kawasaki',
2 => 'Yamaha'
];
Здесь мы можем вызвать массив $bikes как список, поскольку целочисленные ключи здесь находятся в правильном порядке. Но если взять:
$bikes = [
2 => 'Honda',
0 => 'Kawasaki',
1 => 'Yamaha'
];
В этом случае массив $bikes не является списком, так как ключи теперь не идут по порядку.
Теперь, чтобы проверить, является ли массив списком, мы можем написать нашу собственную реализацию вот так:
function is_list(array $array): bool
{
$expectedKey = 0;
foreach ($array as $i => $_) {
if ($i !== $expectedKey) { return false; }
$expectedKey++;
}
return true;
}
$bikes = [
2 => 'Honda',
0 => 'Kawasaki',
1 => 'Yamaha'
];
var_dump(is_list($bikes)); // false
Или, если вы планируете перейти на PHP 8.1, для этого есть функция, которую вы можете использовать прямо из коробки.
Функция array_is_list()
В этом PR для PHP 8.1 будет представлена функция array_is_list(), которую можно использовать для той же цели, о которой я говорил выше.
Итак, если мы хотим переписать наш предыдущий пример с помощью этой функции, мы можем сделать это так:
$bikes = [
0 => 'Honda',
1 => 'Kawasaki',
2 => 'Yamaha'
];
var_dump(array_is_list($bikes)); // true
Вот и все! Это все, что делает эта функция.
Здесь следует отметить, что эта функция не будет правильно работать с массивами, у которых ключи, отличные от целых чисел, по очевидным причинам.
Кроме того, все, что передается в качестве аргумента в array_is_list(), не являющимся массивом, вызовет ошибку типа:
array_is_list(new stdClass()); // исключение TypeError
array_is_list(null); // исключение TypeError
Что интересно, первоначально было предложено назвать функцию is_list(), но далее переименовано, из-за возможности конфликта имен с потенциальным типом списка.
Что думаешь?