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_filter com callback para selecionar produtos com preço > 100.
  • Use usort com operador <=> para ordenar por preço crescente.
  • Exiba cada produto em uma linha no formato nome: R$ preco com 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

  1. Definimos o array $produtos com quatro itens, cada um com nome e preco.
  2. array_filter recebe um callback que retorna true apenas se $p['preco'] > 100, gerando $caros com Teclado, Monitor e Headset.
  3. usort ordena $caros no lugar usando o operador spaceship <=> que compara os preços.
  4. Percorremos $caros com foreach e exibimos cada produto formatado com number_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_filter sem callback: array_filter($produtos) remove apenas valores falsy, não é o desejado.
  • Esquecer de atribuir o retorno de array_filter a uma variável: array_filter($produtos, ...) sem atribuição não altera $produtos.
  • Usar usort com 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