Médio PHP
Filtrar e ordenar produtos
Enunciado
Dado um array de produtos com nome e preco, use array_filter para manter apenas os produtos com preço maior que 100 e depois use usort para ordená-los do mais barato ao mais caro. Exiba o nome e o preço de cada produto no formato nome: R$ preco.
Requisitos
- Use
array_filtercom callback para selecionar produtos com preço > 100. - Use
usortcom operador<=>para ordenar por preço crescente. - Exiba cada produto em uma linha no formato
nome: R$ precocom duas casas decimais.
Código inicial
<?php
$produtos = [
['nome' => 'Teclado', 'preco' => 150],
['nome' => 'Mouse', 'preco' => 80],
['nome' => 'Monitor', 'preco' => 900],
['nome' => 'Headset', 'preco' => 200],
];
// Seu código aqui
Saída esperada
Teclado: R$ 150,00
Headset: R$ 200,00
Monitor: R$ 900,00
Ver dica
Após filtrar, use usort com uma função que compara $a['preco'] e $b['preco']. Para formatar, use number_format($preco, 2, ',', '.').
Mostrar solução
<?php
$produtos = [
['nome' => 'Teclado', 'preco' => 150],
['nome' => 'Mouse', 'preco' => 80],
['nome' => 'Monitor', 'preco' => 900],
['nome' => 'Headset', 'preco' => 200],
];
// Filtra produtos com preço > 100
$caros = array_filter($produtos, fn($p) => $p['preco'] > 100);
// Ordena por preço crescente
usort($caros, fn($a, $b) => $a['preco'] <=> $b['preco']);
// Exibe formatado
foreach ($caros as $p) {
echo $p['nome'] . ': R$ ' . number_format($p['preco'], 2, ',', '.') . "\n";
}
Passo a passo
- Definimos o array
$produtoscom quatro itens, cada um comnomeepreco. array_filterrecebe um callback que retornatrueapenas se$p['preco'] > 100, gerando$caroscom Teclado, Monitor e Headset.usortordena$carosno lugar usando o operador spaceship<=>que compara os preços.- Percorremos
$caroscomforeache exibimos cada produto formatado comnumber_format.
Por que funciona
array_filter preserva as chaves originais, mas usort reindexa o array. A combinação de filtrar e ordenar é comum para preparar dados. O operador <=> retorna -1, 0 ou 1, ideal para usort. A formatação com number_format garante duas casas decimais e separador de milhar.
Erros comuns
- Usar
array_filtersem callback:array_filter($produtos)remove apenas valores falsy, não é o desejado. - Esquecer de atribuir o retorno de
array_filtera uma variável:array_filter($produtos, ...)sem atribuição não altera$produtos. - Usar
usortcom comparação errada:fn($a, $b) => $a['preco'] - $b['preco']funciona, mas<=>é mais seguro e idiomático.
Outra forma de resolver
Usar array_multisort com arrays de preços:
$precos = array_column($caros, 'preco');
array_multisort($precos, SORT_ASC, $caros);
Essa alternativa é útil quando se deseja ordenar por múltiplos critérios simultaneamente.
Saída esperada
Teclado: R$ 150,00
Headset: R$ 200,00
Monitor: R$ 900,00