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
- Buscar o primeiro registro que combina com um critério, sem precisar filtrar o array inteiro antes.
- Validar se pelo menos um item de um carrinho, pedido ou formulário está fora do padrão esperado.
- Garantir que todos os elementos de uma coleção atendem a uma regra antes de prosseguir com um processamento.
- Substituir combinações de
array_filter()+count()ouin_array()com callback customizada, deixando a intenção explícita no nome da função.
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.
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.
0 Comentário
Deixe seu Comentário!
Dúvida, sugestão ou só um "valeu!" — tudo é bem-vindo por aqui.