PHP Coleções Intermediário
Funções de array funcionais
Em PHP, as funções de array funcionais permitem processar coleções de forma declarativa, sem loops explícitos. As principais são array_map (transformar cada elemento), array_filter (selecionar elementos), array_reduce (reduzir a um único valor) e usort (ordenar com critério personalizado).
Essas funções recebem callbacks (funções anônimas ou setas) que definem a lógica. Elas não modificam o array original, mas retornam um novo array (exceto usort, que ordena no lugar). Isso torna o código mais expressivo e menos propenso a erros de índice.
Combinar essas funções em cadeia é uma prática comum: por exemplo, filtrar, mapear e reduzir para calcular totais. O PHP moderno (8.x) suporta arrow functions (fn() => ...), que deixam o código ainda mais conciso.
Neste card, você verá exemplos práticos e exercícios para dominar essas quatro funções e aplicá-las em cenários do dia a dia.
Pontos-chave
array_mapaplica uma função a cada elemento e retorna um novo array com os resultados.array_filterseleciona elementos com base em um callback que retornatrueoufalse.array_reduceacumula um valor único percorrendo o array com uma função de redução.usortordena um array pelos valores usando uma função de comparação personalizada.- Essas funções não alteram o array original (exceto
usort, que ordena no lugar).
<?php
// Exemplo prático das funções funcionais de array
$produtos = [
['nome' => 'Teclado', 'preco' => 150, 'estoque' => 10],
['nome' => 'Mouse', 'preco' => 80, 'estoque' => 0],
['nome' => 'Monitor', 'preco' => 900, 'estoque' => 5],
['nome' => 'Headset', 'preco' => 200, 'estoque' => 2],
];
// 1. Filtrar apenas produtos com estoque > 0
$disponiveis = array_filter($produtos, fn($p) => $p['estoque'] > 0);
// 2. Mapear para obter apenas os nomes
$nomes = array_map(fn($p) => $p['nome'], $disponiveis);
// 3. Ordenar os disponíveis por preço (do mais barato ao mais caro)
usort($disponiveis, fn($a, $b) => $a['preco'] <=> $b['preco']);
// 4. Calcular o valor total em estoque (preço * quantidade)
$valorTotal = array_reduce(
$disponiveis,
fn($acc, $p) => $acc + ($p['preco'] * $p['estoque']),
0
);
echo "Produtos disponíveis: " . implode(', ', $nomes) . "\n";
echo "Valor total em estoque: R$ " . number_format($valorTotal, 2, ',', '.') . "\n";