Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoa, Resolvi um problema aqui faz algum tempo neste tópico: http://forum.imasters.com.br/topic/548349-eliminar-menor-nota/
Então o código sendo este.
<?php
$n1 = 5.5;
$n2 = 7.5;
$n3 = 10;
$n4 = NULL;
$n5 = NULL;
$notas = [ $n1, $n2, $n3, $n4, $n5 ];
$notas = array_filter( $notas, function( $nota ){ return !is_null( $nota ); } );
sort( $notas, SORT_NUMERIC );
$nota_mais_baixa = array_shift( $notas );
$media = array_sum( $notas ) / count( $notas );
printf(
'Nota mais baixa: %.2f<br>Media: %.2f',
$nota_mais_baixa,
$media
);
Ele está ok, acontece que reescrevi todo meu código em mysqli, sem problemas, mas o que acontece é que agora ao testar na versão 7 do php ele retorna nan aonde vinha 0.00
Até a versão 5.6 do php ele está ok, mas no 7 ele já retorna o nan. Quando se tem valores ele está perfeito, mas enquanto não tem notas lançadas ele retorna o nan. Alguém saber a solução?
Além de informar: Warning Division by zero in na linha: $media = array_sum( $notas ) / count( $notas );
Essa divisão por zero vou ver a verificação, mas não me é o maior problema, agora estar vindo esse nan é que não estou conseguindo resolver;
No caso ali ele faz a soma das notas e obtém o resultado, e no caso se tiver a nota de recuperação n5 ele remove a menor nota.
Do jeito que está, se tiver duas notas lançadas. n1 + n2 ele soma as duas e divide por dois, se tiver tres ele faz o mesmo. Quando eu removo
$notas = array_filter( $notas, function( $nota ){ return !is_null( $nota ); } );
Ele sai o nan e volta ao normal, porém as divisões passam a ser por 4. Se eu tiver n1 + n2 ele soma as duas e divide por 4. Aí no caso não é o ideal pra mim.
Acabei de testar no PHP 7.0.8 e está retornando o que é esperado.
O que está sobrando no array após o array_filter?
Bom, eu coloquei o exemplo da solução, com o printif ele executa corretamente, mas para a solução que uso no meu sistema ele da o erro. Aqui a continuidade. No meu caso eu pego as notas do banco, retiro o printif e depois chamo o resultado.
//Soma as Notas para o total
$n1 = $notaD["n1"];
$n2 = $notaD["n2"];
$n3 = $notaD["n3"];
$n4 = $notaD["n4"];
$n5 = $notaD["n5"]; #recuperacao / nota extra
$notas = [ $n1, $n2, $n3, $n4, $n5];
$notas = array_filter($notas, function( $nota ) {
return !is_null($nota);
});
//ordenamos em ordem crescente
sort($notas, SORT_NUMERIC);
//removemos a primeira nota do array ordenado, no caso a mais baixa
$nota_mais_baixa = array_shift($notas);
//calculamos a media aritmética
$mediaMateria = array_sum($notas) / count($notas);
Chamo o resultado abaixo
//Calcula Media por Materia
$mediaMateria;
$nota_mais_baixa;
//Guardo a Media Total das Materias
$mediaTotal = $mediaMateria + $mediaTotal;
?>
<td width="75" align="center" bgcolor="#CFCFCF"><?php
if ($mediaMateria == '') {
$cor = "green";
} elseif ($mediaMateria >= $media) {
$cor = "blue";
} else {
$cor = "red";
}
?>
<b style="color: <?= $cor ?>">
<?php echo number_format($mediaMateria, 2, ".", ",") ?>
</b></td>
Neste cenário é perfeito até a versão 5.6 do php
Assim fica nas versões até 5.6
Média é 7, abaixo fica vermelho, acima azul e caso não tenha notas lançadas fica em 0.00 destacando o verde. Faz a soma pelo número de notas lançadas e a divide pela mesma quantidade.
Já na 7.0 ele só aparece o resultado após lançada alguma nora, sendo 0.00 ele retona o nan, e não faz a média total no final.
NaN é um problema de conversão (normalmente). Tente utilizar um debugger (como o xDebug) para encontrar o ponto de problema.
Outra situação, suas validações não são consistentes.
if ($mediaMateria == '') {
String vazia não é igual a null. E sendo integer, também não é igual (apesar do cast type o fazer parecer).
Utilize validações mais consistentes, como is_null ou is_nan (se for o caso, é claro).
Essa solução o ESerra tinha me passado em razão da cor. http://forum.imasters.com.br/topic/549520-media-com-cor-diferente/
Não existe divisão por zero, faça a verificação antes de efetivar a operação.