Desafio PHP

Ordenando e filtrando array de notas

Enunciado

Crie um array associativo com nomes de alunos e suas notas (ex.: ["Ana" => 8.5, "Bruno" => 6.0, "Carla" => 9.0, "Diego" => 7.5]). Ordene o array pela nota em ordem decrescente usando arsort. Em seguida, crie um novo array contendo apenas os alunos com nota maior ou igual a 7. Exiba o array filtrado no formato Nome: nota (uma linha por aluno) e, ao final, mostre a média das notas dos alunos aprovados com duas casas decimais.

Requisitos

  • Use arsort para ordenar o array original pela nota em ordem decrescente.
  • Crie um novo array com os alunos aprovados (nota >= 7) usando foreach ou array_filter.
  • Exiba cada aluno aprovado no formato Nome: nota.
  • Calcule e exiba a média das notas dos aprovados com number_format e duas casas decimais.

Código inicial

<?php
$notas = [
    "Ana" => 8.5,
    "Bruno" => 6.0,
    "Carla" => 9.0,
    "Diego" => 7.5
];

// Ordene com arsort
// Filtre os aprovados
// Exiba e calcule a média

Saída esperada

Carla: 9
Ana: 8.5
Diego: 7.5
Média: 8.33
Ver dica

Após arsort($notas), use um foreach para criar $aprovados com if ($nota >= 7). Para a média, some as notas e divida por count($aprovados).

Mostrar solução
<?php
$notas = [
    "Ana" => 8.5,
    "Bruno" => 6.0,
    "Carla" => 9.0,
    "Diego" => 7.5
];

// Ordena pela nota em ordem decrescente, mantendo as chaves
arsort($notas);

// Cria array de aprovados (nota >= 7)
$aprovados = [];
foreach ($notas as $nome => $nota) {
    if ($nota >= 7) {
        $aprovados[$nome] = $nota;
    }
}

// Exibe os aprovados
foreach ($aprovados as $nome => $nota) {
    echo "$nome: $nota\n";
}

// Calcula a média
$soma = array_sum($aprovados);
$media = $soma / count($aprovados);
echo "Média: " . number_format($media, 2, '.', '') . "\n";

Passo a passo

  1. Definimos o array associativo $notas com quatro alunos e suas notas.
  2. Usamos arsort($notas) para ordenar o array pelos valores (notas) em ordem decrescente, mantendo a associação entre nomes e notas.
  3. Criamos um array vazio $aprovados e percorremos $notas com foreach; se a nota for maior ou igual a 7, adicionamos o par ao novo array.
  4. Exibimos cada aluno aprovado no formato Nome: nota usando outro foreach.
  5. Calculamos a soma das notas dos aprovados com array_sum($aprovados).
  6. Dividimos a soma pela quantidade de aprovados (count($aprovados)) para obter a média.
  7. Formatamos a média com number_format($media, 2, '.', '') para exibir duas casas decimais com ponto.

Por que funciona

O arsort é ideal para ordenar arrays associativos por valor em ordem decrescente, preservando as chaves. O filtro manual com foreach é didático e mostra como construir um novo array seletivamente. A função array_sum soma todos os valores de um array, e count retorna o número de elementos, permitindo calcular a média facilmente.

Erros comuns

  • Usar sort em vez de arsort: sort reindexa o array e perde os nomes como chaves, então $notas deixaria de ser associativo.
  • Esquecer de verificar se $aprovados não está vazio antes de dividir: se nenhum aluno tiver nota >= 7, count retorna 0 e ocorre divisão por zero.
  • Usar number_format($media, 2) sem o separador decimal: o padrão é vírgula, mas o esperado é ponto. Especifique '.' como terceiro argumento.
  • Confundir array_sum com array_product: o primeiro soma, o segundo multiplica.

Outra forma de resolver

Podemos usar array_filter para criar o array de aprovados de forma mais concisa:

$aprovados = array_filter($notas, fn($nota) => $nota >= 7);

Isso é preferível quando a lógica de filtro é simples e não precisamos de efeitos colaterais. Porém, o foreach é mais explícito para iniciantes.

Saída esperada

Carla: 9
Ana: 8.5
Diego: 7.5
Média: 8.33