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
arsortpara ordenar o array original pela nota em ordem decrescente. - Crie um novo array com os alunos aprovados (nota >= 7) usando
foreachouarray_filter. - Exiba cada aluno aprovado no formato
Nome: nota. - Calcule e exiba a média das notas dos aprovados com
number_formate 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
- Definimos o array associativo
$notascom quatro alunos e suas notas. - Usamos
arsort($notas)para ordenar o array pelos valores (notas) em ordem decrescente, mantendo a associação entre nomes e notas. - Criamos um array vazio
$aprovadose percorremos$notascomforeach; se a nota for maior ou igual a 7, adicionamos o par ao novo array. - Exibimos cada aluno aprovado no formato
Nome: notausando outroforeach. - Calculamos a soma das notas dos aprovados com
array_sum($aprovados). - Dividimos a soma pela quantidade de aprovados (
count($aprovados)) para obter a média. - 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
sortem vez dearsort:sortreindexa o array e perde os nomes como chaves, então$notasdeixaria de ser associativo. - Esquecer de verificar se
$aprovadosnão está vazio antes de dividir: se nenhum aluno tiver nota >= 7,countretorna 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_sumcomarray_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