Como funciona a função array_is_list no PHP 8.1?
O PHP 8.1 está atualmente em desenvolvimento ativo e está programado para ser lançado no final do ano de 2021.
Neste artigo, vamos falar um pouco sobre a nova função array_is_list
.
Como funciona array_is_list?
A função array_is_list
retorna um boolean
ao verificar se determinado array
contém chaves inteiras sequenciais começando do número 0. Em outras palavras, esta função retorna true
se o array
testado for uma lista de valores. Ou seja, um array
cuja todas as chaves são int
, que comecem do número 0
e sem "pulos" entre eles.
Veja alguns exemplos que seriam avaliados como verdadeiro:
array_is_list([]); // true
array_is_list([1, 2, 3]); // true
array_is_list(['uva', 2, 3]); // true
array_is_list(['banana', 'maçã']); // true
array_is_list([0 => 'morango', 'pêra']); // true
array_is_list([0 => 'limão', 1 => 'maracujá']); // true
Qualquer array
com chaves, não começando de zero ou que não possua todas as chaves como inteiros em ordem sequencial, serão avaliados como false
.
Veja:
array_is_list([1 => 'maçã', 'uva']); // false
array_is_list([0 => 'zero', 2 => 'dois']); // false
array_is_list([0 => 'zero', 'nome' => 'Maxters']); // false
array_is_list([1 => 'limão', 0 => 'pêra']); // false
Se você tentar passar qualquer tipo de argumento para essa função, que não seja um array
, será lançado um TypeError
. Mesmo os tipos iterable
não são aceitos como argumento dessa função.
Qual é a importância dessa função?
Há alguns casos onde você pode precisar que o array
seja sequencial, como no caso da função json_encode
. Por exemplo, se você aplicar json_encode
em um array
que seria avaliado como false
por array_is_list
, ao invés de retornar um objeto JSON correspondente a um Array
em Javascript, você teria um Object
.
Exemplo:
array_is_list([1, 2, 3]); // true
json_encode([1, 2, 3]); // "[1, 2, 3]"
array_is_list([1 => 1, 2, 3]); // false
json_encode([1 => 1, 2, 3]); // "{"1":1,"2":2,"3":3}"
Polyfill
Para versões anteriores ao PHP 8.1, podemos utilizar um polyfill para suprir a falta da mesma.
Veja:
if (! function_exists('array_is_list')) {
function array_is_list(array $array): bool
{
$expected = 0;
foreach ($array as $i => $_) {
if ($i !== $expected) return false;
$expected++;
}
return true;
}
}