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
processardeve ter a assinaturafunction 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 )(usandoprint_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
- Declaramos
processarcom três parâmetros: array e doiscallable. - Dentro, usamos
array_filterpassando o array e o filtro; isso mantém apenas os elementos para os quais o filtro retornatrue. - Em seguida,
array_mapaplica o transformador a cada elemento filtrado. array_valuesgarante que os índices sejam sequenciais (0, 1, ...), poisarray_filterpreserva as chaves originais.- Fora da função, criamos as arrow functions
$filtroe$transformador. - Chamamos
processare imprimimos o resultado comprint_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] => 20e[3] => 40, alterando a saída esperada. - Passar um callable inválido: se
$filtronão for callable, o PHP lançaTypeError. - Usar
fn($n) => $n % 2 == 0com==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
)