Médio PHP

Filtrar e transformar com callable

Enunciado

Escreva uma função processar que recebe um array e dois callables: um filtro e um transformador. Ela deve filtrar os elementos com o filtro e depois aplicar o transformador, retornando o novo array. Use arrow functions para definir os callables.

Requisitos

  • A função processar deve ter a assinatura function processar(array $itens, callable $filtro, callable $transformador): array.
  • O filtro deve manter apenas números pares.
  • O transformador deve multiplicar cada número por 10.
  • A saída deve ser Array ( [0] => 20 [1] => 40 ) (usando print_r).

Código inicial

<?php

function processar(array $itens, callable $filtro, callable $transformador): array {
    // Implemente
}

$numeros = [1, 2, 3, 4, 5];
// Defina $filtro e $transformador com arrow functions
// Chame processar e imprima com print_r

Saída esperada

Array
(
    [0] => 20
    [1] => 40
)
Ver dica

Use array_filter e array_map dentro de processar. Lembre-se de reindexar o array com array_values se necessário.

Mostrar solução
<?php

function processar(array $itens, callable $filtro, callable $transformador): array {
    $filtrados = array_filter($itens, $filtro);
    $transformados = array_map($transformador, $filtrados);
    return array_values($transformados); // reindexa
}

$numeros = [1, 2, 3, 4, 5];
$filtro = fn($n) => $n % 2 === 0;
$transformador = fn($n) => $n * 10;

$resultado = processar($numeros, $filtro, $transformador);
print_r($resultado);

Passo a passo

  1. Declaramos processar com três parâmetros: array e dois callable.
  2. Dentro, usamos array_filter passando o array e o filtro; isso mantém apenas os elementos para os quais o filtro retorna true.
  3. Em seguida, array_map aplica o transformador a cada elemento filtrado.
  4. array_values garante que os índices sejam sequenciais (0, 1, ...), pois array_filter preserva as chaves originais.
  5. Fora da função, criamos as arrow functions $filtro e $transformador.
  6. Chamamos processar e imprimimos o resultado com print_r.

Por que funciona

O tipo callable permite que a função aceite qualquer coisa chamável: closures, arrow functions, nomes de funções, etc. Arrow functions capturam automaticamente variáveis externas, mas aqui não precisamos de captura. A combinação de array_filter e array_map é idiomática para processar arrays.

Erros comuns

  • Esquecer array_values: o array resultante mantém chaves como [1] => 20 e [3] => 40, alterando a saída esperada.
  • Passar um callable inválido: se $filtro não for callable, o PHP lança TypeError.
  • Usar fn($n) => $n % 2 == 0 com == em vez de ===: funciona para inteiros, mas === é mais seguro.

Outra forma de resolver

Usar array_reduce para combinar filtro e transformação em uma passada:

$resultado = array_reduce($numeros, function($carry, $n) use ($filtro, $transformador) {
    if ($filtro($n)) {
        $carry[] = $transformador($n);
    }
    return $carry;
}, []);

Essa abordagem é útil quando se quer evitar múltiplas passagens pelo array.

Saída esperada

Array
(
    [0] => 20
    [1] => 40
)