Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom galera, eu estou fazendo uma classe com diferentes operações matemáticas, e comecei a ter problemas na media e media ponderada:
Qual é ele?
Eu não consigo gerar loop dentro de uma variável.
Eis meu código:
<?
function media($valor) {
$contar = count(explode(', ', $valor))
for ($i=0; $i<$contar; $i++){
$soma = foreach(", ","",$valor1);
}
$resultado = $soma / $contar;
echo "$resultado";
}
media("10, 20, 30");
?>Hmm, obrigado, não sabia da existência destas funções.
Só tem um problema com essa função André, veja:
avg( 'A', 'B', 1 ); // 0.333333333
Isso porque, desde o PHP 4.2.1, array_sum() converte os tipos dos valores do array passado para inteiros e, como uma letra não é um número, é convertido para zero.
O problema maior está na segunda metade da "fórmula", pois para func_get_args() não importa se você está passando inteiro, string, objeto ou tudo junto, ele apenas contará, logo:
avg( 'A', 'B', 1 );
É o mesmo que:
avg( 0, 0, 1 ); // ( 0 + 0 + 1 / 3 ) = 1 / 3 = 0.333333333
Então, uma correçãozinha rápida, seria remover os índices nulos (zeros) que caracterizaria a divisão:
function avg() {
$args = array_map( 'intval', func_get_args() );
return array_sum( $args ) / count( array_filter( $args ) );
}
Podem haver outras mais eficientes, mas essa é uma delas ;)
P.S.: Tudo isso pderia ter sido evitado se houvesse uma Função Matemática nativa para calcular média. <_<
A média aritmética ponderada está com um problema:
O Resultado está indo além do esperado, eu estou somando todos os valores e multiplicando pelo peso, mas no caso teria que multiplicar o valor pelo peso um por um e depois somar e dividir pela soma dos pesos.
Eis o código, sem a parte da divisão:
Function media_ponderada($quantidade, $peso){
$peso = explode(', ', $peso);
$quantidade = explode(', ', $quantidade);
return array_sum($quantidade)*array_sum($peso);
}media_ponderada("3, 9", "1, 2")
Nesse caso deveria resultar em 21, porém esta dando 36
Média aritmética ponderada:
M = (p[1]x[1] + p[2]x[2] + ... + p[n]x[n])/(p[1] + p[2] + ... + p[n])
No caso,você está fazendo:
M = (x[1] + x[2] + ... + x[n])(p[1] + p[2] + ... + p[n])
O que é totalmente diferente do apresentado.
A função poderia ser algo como:
<?php
function pAvg()
{
$args = func_get_args();
$s = 0;
$q = 0;
foreach($args as $arg) {
$s += array_product($arg);
$q += $arg[1];
}
return $s/$q;
}
echo pAvg(array(10,2),array(10,1));
?>>
function avg() {
$args = array_map( 'intval', func_get_args() );
return array_sum( $args ) / count( array_filter( $args ) );
}
Pra mim funcionou assim:
function media_aritmetica($vetor) {
if (count( array_filter( $vetor ))!=0) {
return array_sum($vetor) / count(array_filter($vetor));
} else {
return false;
}
}
Na média aritmetica, você pode utilizar func_get_args() e func_num_args(). Veja como fica simples:
Você pode passar quantos argumentos quiser, que ela irá retornar a média desses argumentos.
echo avg( 1, 2 ); // 1.5
echo avg( 10, 20, 30 ); // 20
echo avg( 20, 50 ) // 35