array_find(), array_any() e array_all() no PHP 8.4

Como as novas funções array_find(), array_find_key(), array_any() e array_all() do PHP 8.4 simplificam a busca e validação de elementos em arrays, parando a execução assim que a resposta é conhecida.

Procurar um elemento em um array que satisfaça uma condição, ou verificar se todos (ou algum) elementos passam num teste, sempre exigiu montar um foreach manual ou recorrer a combinações pouco intuitivas de array_filter() com array_values(). O PHP 8.4 resolve isso com quatro novas funções nativas: array_find(), array_find_key(), array_any() e array_all().

O jeito antigo

Antes do PHP 8.4, encontrar o primeiro elemento que batia com uma condição normalmente passava por array_filter() seguido de reset(), ou por um loop com break:

$usuarios = [
    ['nome' => 'Ana', 'ativo' => false],
    ['nome' => 'Bruno', 'ativo' => true],
    ['nome' => 'Carla', 'ativo' => true],
];

$filtrados = array_filter($usuarios, fn($u) => $u['ativo']);
$primeiro = reset($filtrados) ?: null; // funciona, mas percorre o array inteiro

O problema não é só a verbosidade: array_filter() percorre todo o array antes de você pegar só o primeiro resultado, mesmo quando a resposta certa já apareceu no segundo item.

array_find(): o primeiro valor que combina

array_find() recebe um array e uma callback, e devolve o valor do primeiro elemento para o qual a callback retorna true. A busca para assim que encontra o elemento, e devolve null se nenhum combinar:

$usuarios = [
    ['nome' => 'Ana', 'ativo' => false],
    ['nome' => 'Bruno', 'ativo' => true],
    ['nome' => 'Carla', 'ativo' => true],
];

$primeiroAtivo = array_find($usuarios, fn($u) => $u['ativo']);
echo $primeiroAtivo['nome']; // Bruno

$inexistente = array_find($usuarios, fn($u) => $u['nome'] === 'Zeca');
var_dump($inexistente); // NULL

array_find_key(): a chave em vez do valor

Quando o que importa é a posição ou a chave do elemento, não o valor em si, array_find_key() faz o mesmo trabalho devolvendo a chave correspondente:

$precos = [
    'camiseta' => 49.90,
    'tenis' => 199.90,
    'bone' => 39.90,
];

$chave = array_find_key($precos, fn($valor, $chave) => $valor > 100);
echo $chave; // tenis

Repare que a callback recebe o valor como primeiro argumento e a chave como segundo, na mesma ordem usada em array_walk().

array_any() e array_all(): testando o array inteiro

array_any() retorna true assim que algum elemento satisfaz a callback, sem precisar percorrer o resto do array. array_all() faz o oposto: retorna true só se todos os elementos passarem, parando no primeiro que falhar:

$pedido = [
    ['produto' => 'Notebook', 'estoque' => 0],
    ['produto' => 'Mouse', 'estoque' => 15],
];

$temItemEsgotado = array_any($pedido, fn($item) => $item['estoque'] === 0);
var_dump($temItemEsgotado); // bool(true)

$todosDisponiveis = array_all($pedido, fn($item) => $item['estoque'] > 0);
var_dump($todosDisponiveis); // bool(false)

Antes dessas funções, esse tipo de checagem costumava ser feito com count(array_filter(...)) > 0, que sempre percorre o array inteiro mesmo quando a resposta já ficou clara no primeiro item.

Array vazio

Vale lembrar o comportamento em arrays vazios, que segue a mesma lógica matemática de "existe" e "para todo": array_any() devolve false (não existe nenhum elemento que satisfaça nada) e array_all() devolve true (a condição vale vacuamente para todos os zero elementos):

var_dump(array_any([], fn($v) => true));  // bool(false)
var_dump(array_all([], fn($v) => false)); // bool(true)

Quando usar

Cuidados

Essas quatro funções exigem PHP 8.4 ou superior — não há como usá-las em versões anteriores sem um polyfill próprio. Além disso, todas param a execução assim que a resposta já é conhecida (short-circuit), então não assuma que a callback será chamada para todos os elementos do array.

Compatibilidade

As quatro funções foram introduzidas no PHP 8.4 (lançado em novembro de 2024) e exigem essa versão ou superior.

documentação oficial

Conclusão

array_find(), array_find_key(), array_any() e array_all() cobrem operações extremamente comuns que antes exigiam loops manuais ou combinações indiretas de funções existentes. Além de deixarem o código mais legível, elas param a busca assim que a resposta é conhecida, evitando percorrer o array inteiro sem necessidade.

Tecnologia:
php

Deixe seu Comentário!

Dúvida, sugestão ou só um "valeu!" — tudo é bem-vindo por aqui.

Comentário
Nome
Email
lock Seu e-mail não será publicado.