PHP 8.1: функция array_is_list

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(), но далее переименовано, из-за возможности конфликта имен с потенциальным типом списка. 

Сергей Мухин

Веб-разработчик со стажем программирования более 9 лет, всегда в процессе учебы и созидания.

Есть вопросы?

Я почти всегда в режиме онлайн

Связаться со мной