Foros del Web » Programando para Internet » PHP »

Sacar una media entre varios numeros

Estas en el tema de Sacar una media entre varios numeros en el foro de PHP en Foros del Web. hola, mi pregunta es la siguiente: estoy haciendo una web que es un TOP, y en ella hay dos valores uno es el contador de ...
  #1 (permalink)  
Antiguo 11/07/2003, 11:42
Avatar de nuevo  
Fecha de Ingreso: mayo-2003
Ubicación: Spain
Mensajes: 2.009
Antigüedad: 20 años, 10 meses
Puntos: 2
Sacar una media entre varios numeros

hola, mi pregunta es la siguiente:

estoy haciendo una web que es un TOP, y en ella hay dos valores uno es el contador de visitas y otro el contador de votaciones, pues me gustaria saber como se hace para que haga una media entre esos dos resultados con los demas de la BD... no se si me esplique bien... les pongo un ejemplo...
------------------------------------
ejemplo:
web1: visitas 3 - votos 1
web2: visitas 5 - votos 2
web3: visitas 2 - votos 0
web4: visitas 8 - votos 8
------------------------------------

ahora se supone que cuando muestro la tabla con los resultados... yo lo tengo para que el que mas visitas tenga mas alto este en la tabla... pero claro... me gustaria que tb los votos influyeran en ella... osea si una web tiene 8 visitas y 1 voto... estara debajo de otra web que tenga 6 vitas pero 5 votos....

esto como se puede hacer....
__________________
3w.valenciadjs.com
3w.laislatv.com
  #2 (permalink)  
Antiguo 11/07/2003, 18:03
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 8 meses
Puntos: 1
Es una interesante pregunta. No entendí muy bien si quieres que cada voto tenga un valor distinto a las visitas, o que "pesen" básicamente lo mismo... es decir, que el valor total de una web sea simplemente la suma de los dos valores.

En cualquier caso, y si no te he malinterpretado, creo que algo como esto podría aplicarse a tu problema:

Código:
<?php

// Estructura con la informacion de las "webs". Esta forma de disenyar
// la estructura el completamente arbitraria.

$datos = array (array ('nombre' => 'web1', 'visitas' => 3, 'votos' => 1),
                array ('nombre' => 'web2', 'visitas' => 5, 'votos' => 2),
                array ('nombre' => 'web3', 'visitas' => 2, 'votos' => 0),
                array ('nombre' => 'web4', 'visitas' => 8, 'votos' => 8));

$cantidad = count ($datos);  // Tamanyo del arreglo

// Ahora, para presentarlos en orden, se asume que el "valor" de cada
// web es dado simplemente por la suma de sus visitas y sus votos (es
// decir, la cantidad de visitas es igual de importante que el numero
// de votos).

$valores = array();  // Arreglo temporal

for ($i = 0; $i < $cantidad; $i++) {
    // Se forma un arreglo temporal para crear una relacion entre cada
    // web y su "valor de orden".
    array_push ($valores, array ('indice' => $i,
                                 'valor' => $datos[$i]['visitas'] +
                                 $datos[$i]['votos']));
}

// Ahora se realiza un ordenamiento en el arreglo temporal,
// implementando una rutina propia con el proposito de no hacer mas
// manipulaciones con los tipos de datos.

// Algoritmo de ordenamiento por seleccion, orden decreciente.

for ($i = 0; $i < $cantidad - 1; $i++) {
    $mayor = $i;

    for ($j = $i + 1; $j < $cantidad; $j++)
        if ($valores[$j]['valor'] > $valores[$i]['valor'])
            $mayor = $j;

    if ($mayor != $i) {
        $aux = $valores[$i];
        $valores[$i] = $valores[$mayor];
        $valores[$mayor] = $aux;
    }
}

// Finalmente... Mostrar los datos en orden.

for ($i = 0; $i < $cantidad; $i++) {
    print $i + 1 . ". " . $datos[$valores[$i]['indice']]['nombre'] . " - " .
        $datos[$valores[$i]['indice']]['votos'] . " votos, " .
        $datos[$valores[$i]['indice']]['visitas'] . " visitas.\n<br />\n";
}

?>
Como verás, me inventé la estructura de tus datos, colocándolos en un arreglo de arreglos. Si los almacenas de otra manera (cosa bastante probable), podrías o bien retocar el código, o quizás agregar un paso previo en el que transformes tus datos a una estructura similar a la que usa este código. Espero que sea fácil de entender. :)
  #3 (permalink)  
Antiguo 11/07/2003, 18:59
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 2 meses
Puntos: 5
Que tal nuevo!

Bueno, creo que la solución que te ha propuesto leonardop es buena, aunque creo que puede ser un tanto complicada... aqui te va mi propuesta de lo que creo que puedes hacer...

Código PHP:
//Primer paso... sacar los maximos, tanto de visitas como de votos,
// para que tengas contra que comparar los registros.
$qr1=mysql_query("select max(visitas) as visitas, max(votos) as votos from tutabla");
$rs1=mysql_fetch_array($qr1);
$max_visita=$rs1["visitas"];
$max_votos=$rs1["votos"];

// Bien, ahora ya sabemos cuales son los valores máximos que pueden encontrarse
// en cada campo, y ahora definimos la importancia que tienen las
// visitas contra los votos...


// aqui estamos diciendo que la posicion que se reciba gracias a los votos, tendrá
// un peso del 60% en el ranking, y la cantidad de visitas un 40%
$imp_visitas=0.4;
$imp_votos=0.6;


// Ahora si, construimos el query con el que vas a mostrar los resultados...

$qr2=mysql_query("select a.*, (((a.visitas/$max_visita)*$imp_visitas) + ((a.votos/$max_votos)*$imp_votos)) as ranking from tutabla a order by ranking desc");


// LISTO!!!

//Ahora si puedes mostrar tus registros, incluso puedes mostrar 
//el ranking de cada quien, que será un número entre 0 y 1, 
//siendo el 1 el del ranking mas alto. 
Bueno, espero que hayas comprendido mi idea, si no, pues le intentamos de nuevo.



Por cierto, el post parece largo, pero si lo descomentamos, te queda en solo esto:

Código PHP:
$qr1=mysql_query("select max(visitas) as visitas, max(votos) as votos from tutabla");
$rs1=mysql_fetch_array($qr1);
$max_visita=$rs1["visitas"];
$max_votos=$rs1["votos"];
$imp_visitas=0.4;
$imp_votos=0.6;
$qr2=mysql_query("select a.*, (((a.visitas/$max_visita)*$imp_visitas) + ((a.votos/$max_votos)*$imp_votos)) as ranking from tutabla a order by ranking desc"); 
__________________
Manoloweb
  #4 (permalink)  
Antiguo 11/07/2003, 20:15
Avatar de nuevo  
Fecha de Ingreso: mayo-2003
Ubicación: Spain
Mensajes: 2.009
Antigüedad: 20 años, 10 meses
Puntos: 2
Gracias ManoloWeb y leonardop, si... es justo lo que buscaba... un 10 para los dos... ;)
__________________
3w.valenciadjs.com
3w.laislatv.com
  #5 (permalink)  
Antiguo 13/07/2003, 07:08
Avatar de nuevo  
Fecha de Ingreso: mayo-2003
Ubicación: Spain
Mensajes: 2.009
Antigüedad: 20 años, 10 meses
Puntos: 2
umm... lo leo y creo llegar a entenderlo... pero algo pasa que no llegan los datos al cerebro correctamente... quizas la falta de aceite xxxxxxxxxddddd, es broma...

se me olvido decir que yo los resultados los estoy pasando por un Paginado.... y la verdad... es demasiado para mi el mezclarlo todo... ... alguna idea para este mexclaillo... a mi me da siempre error... uso este codigo para mostrar los resultados.

Código PHP:
<?php
require ("aut_config.inc.php");
$pagina $HTTP_GET_VARS["pagina"];
include(
"class.paginado.php");
$rs = new paginado($db_connect); 
$rs->pagina($pagina); 
$rs->porPagina($number_pages);
$rs->propagar("ver");
if (!isset(
$_GET['accion'])){
$usuario_consulta mysql_query("SELECT $selecttbl FROM $sql_tabla") or die("$error6");
echo <<< HTML
<body><table width=500 border="1" cellspacing="1" cellpadding="1" bordercolor="DarkGray" align="center">
    <td colspan="2" align="center" width="386"><b><font face="Verdana" size="1" >Site Name</font></b><b><font face="Verdana" size="1" ></font></b></td>
        <td width="50"><div align="center"><b><font face="Verdana" size="1" >Visitas</font></b></div></td>
    <td width="50"><div align="center"><b><font face="Verdana" size="1" >Votos</font></b></div></td>
</body>
HTML;
     if(!
$rs->query("SELECT * FROM $sql_tabla ORDER BY visitas DESC"))
{
     die( 
$rs->error() );
}
$cuenta="0";
while(
$resultados $rs->obtenerArray()) {
$webname =$resultados[webname];
$webname strtoupper ($webname);
$descripcion=$resultados[descripcion];
$descripcion strtoupper ($descripcion);
$cuenta++;
echo <<< HTML
<tr>
    <td width="31" bgcolor="Gray"><div align="center"><font face="Arial" size="1" color="Aquamarine"><b>$cuenta</b>
    <td width="344" bgcolor="Gray"><div align="left"><a href="home.yump.php?accion=download&id=$resultados
[id]" target="_blanck"><font face="Verdana" size="1" color="Yellow"><b>.: $webname :.</font></a></div></td>
    <td width="50" bgcolor="Gray"><div align="center"><font face="Arial" size="1" color="Aquamarine">$resultados
[visitas]
    <td width="50" bgcolor="Gray"><div align="center"><font face="Arial" size="1" color="Aquamarine">$resultados
[votos]
    <div align="center">
    </td>
</tr>
<td colspan="4"><center><br><a href="home.yump.php?accion=download&id=$resultados
[id]" target="_blanck"><img src="banner/$resultados[imagen]" alt="" height="60" width="400" border="0"></a><br><center><font face="Arial" size="1" color="Orange">$descripcion<a><br>
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" height="40" width="294">
    <param name="movie" value="swf/b.votar.swf">
        <param name="quality" value="best">
        <param name="play" value="true">
    <embed height="40" pluginspage="http://www.macromedia.com/go/getflashplayer" src="b.votar.swf" type="application/x-shockwave-flash" width="294" quality="best" play="true">
</object><a href="cuenta.voto.php?accion=votar&id=$resultados
[id]" target="_self"><img src="images/carpeta.gif" alt="" height="23" width="32" border="0"><br><br>
HTML;
}
echo 
"</table>";
mysql_free_result($usuario_consulta);
mysql_close();
}
?>
</div></td></tr><tr height="15"><td align="center" valign="top" height="15">
<?php
echo "<center><br><font face=Arial size=1 color=white>";
echo 
$rs->anterior()." | ".$rs->nroPaginas()." | ".$rs->siguiente();
?>
</td></tr></table></td></tr>
<tr><td colspan="2" width="513"><img src="images/conarea_05.jpg" width="513" height="6"></td></tr></table></td></tr></table></td></tr>
<tr height="21">
<td align="center" width="182" valign="top" height="21" background="images/brbg2.gif"></td>
<td align="center" width="579" height="21" valign="middle" background="images/brbg2.gif"><font size="1" face="tahoma, arial">
<?php
$antes 
6389;
echo 
'<font face=Helvetica size=1 color=White>Datos descargados:<a> <font face=Helvetica size=1 color=Yellow>';
echo 
round(((ob_get_length()+$antes)/1024)*100)/100;
echo 
'<font face=Helvetica size=1 color=White></a>kb ';
ob_end_flush();
echo
"<font face=Helvetica size=1 color=Yellow>";
echo 
$_SERVER[HTTP_USER_AGENT];
?>
si hace falta pongo el del paginado, pero creo que lo conocereis de sobra en cuanto veais la llamada query...
__________________
3w.valenciadjs.com
3w.laislatv.com
  #6 (permalink)  
Antiguo 14/07/2003, 03:48
Avatar de nuevo  
Fecha de Ingreso: mayo-2003
Ubicación: Spain
Mensajes: 2.009
Antigüedad: 20 años, 10 meses
Puntos: 2
alguien que se atreva.... ;)
__________________
3w.valenciadjs.com
3w.laislatv.com
  #7 (permalink)  
Antiguo 14/07/2003, 17:23
Avatar de nuevo  
Fecha de Ingreso: mayo-2003
Ubicación: Spain
Mensajes: 2.009
Antigüedad: 20 años, 10 meses
Puntos: 2
una ayudita please....;)
__________________
3w.valenciadjs.com
3w.laislatv.com
  #8 (permalink)  
Antiguo 14/07/2003, 17:36
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 2 meses
Puntos: 5
Lo que no veo es donde esta el codigo que te pasé...

El problema que veo es que las sentencias SQL estan armadas dinamicamente, así que no se exactamente en donde deberías modificar el query...
__________________
Manoloweb
  #9 (permalink)  
Antiguo 14/07/2003, 17:51
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 8 meses
Puntos: 1
Hola de nuevo. Pues bien, es un poco complicado modificar el código sin poder probarlo realmente, así que es muy posible que lo que escribiré a continuación no funcione de entrada. Pero creo que al menos puede servirte de guía para ver cómo podría adaptarse el procedimiento que te había mencionado antes... Por desgracia no revisé el otro ejemplo de código que nos han contribuido, quizás ese pueda adaptarse incluso más fácilmente a tu programa general.

Bueno, aquí puedes ver lo que se me ha ocurrido para tu caso:

Código:
<?php

require ("aut_config.inc.php");

$pagina = $HTTP_GET_VARS["pagina"];

include("class.paginado.php");

$rs = new paginado($db_connect); 

$rs->pagina($pagina); 

$rs->porPagina($number_pages);

$rs->propagar("ver");

if (!isset($_GET['accion'])){

    $usuario_consulta = mysql_query("SELECT $selecttbl FROM $sql_tabla")
        or die("$error6");

    echo <<< HTML

        <body><table width=500 border="1" cellspacing="1"
        cellpadding="1" bordercolor="DarkGray" align="center">

        <td colspan="2" align="center" width="386"><b><font
        face="Verdana" size="1" >Site Name</font></b><b><font
        face="Verdana" size="1" ></font></b></td>

        <td width="50"><div align="center"><b><font face="Verdana"
        size="1" >Visitas</font></b></div></td>

        <td width="50"><div align="center"><b><font face="Verdana"
        size="1" >Votos</font></b></div></td>

        </body>
HTML;

    if (!$rs->query("SELECT * FROM $sql_tabla ORDER BY visitas DESC")) {
        die( $rs->error() );
    }

    $cuenta="0";



// --------------------------------------
// Este es el segmento que fue modificado
// --------------------------------------

    $datos = array ();

    while ($resultados = $rs->obtenerArray())
        array_push ($datos, $resultados);


    $cantidad = count ($datos);  // Tamanyo del arreglo

    $valores = array();  // Arreglo temporal

    for ($i = 0; $i < $cantidad; $i++) {
        // Se forma un arreglo temporal para crear una relacion entre cada
        // web y su "valor de orden".
        array_push ($valores, array ('indice' => $i,
                                     'valor' => $datos[$i]['visitas'] +
                                     $datos[$i]['votos']));
    }

    for ($i = 0; $i < $cantidad - 1; $i++) {
        $mayor = $i;

        for ($j = $i + 1; $j < $cantidad; $j++)
            if ($valores[$j]['valor'] > $valores[$i]['valor'])
                $mayor = $j;

        if ($mayor != $i) {
            $aux = $valores[$i];
            $valores[$i] = $valores[$mayor];
            $valores[$mayor] = $aux;
        }
    }

    for ($i = 0; $i < $cantidad; $i++) {
        $resultados = $datos[$valores[$i]['indice']];

        $webname = strtoupper ($resultados['webname']);

        $descripcion = strtoupper ($resultados['descripcion']);

//--------------------------
// Fin del segmento alterado
//--------------------------

        $cuenta++;

        echo <<< HTML

            <tr>

            <td width="31" bgcolor="Gray"><div align="center"><font
            face="Arial" size="1" color="Aquamarine"><b>$cuenta</b>

            <td width="344" bgcolor="Gray"><div align="left"><a
            href="home.yump.php?accion=download&id=$resultados[id]"
            target="_blanck"><font face="Verdana" size="1"
            color="Yellow"><b>.: $webname :.</font></a></div></td>

            <td width="50" bgcolor="Gray"><div align="center"><font
            face="Arial" size="1" color="Aquamarine">$resultados[visitas]

            <td width="50" bgcolor="Gray"><div align="center"><font
            face="Arial" size="1" color="Aquamarine">$resultados[votos]

            <div align="center">

            </td>

            </tr>

            <td colspan="4"><center><br><a
            href="home.yump.php?accion=download&id=$resultados[id]"
            target="_blanck"><img src="banner/$resultados[imagen]"
            alt="" height="60" width="400"
            border="0"></a><br><center><font face="Arial" size="1"
            color="Orange">$descripcion<a><br>

            <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"
            height="40" width="294">

            <param name="movie" value="swf/b.votar.swf">

            <param name="quality" value="best">

            <param name="play" value="true">

            <embed height="40"
            pluginspage="http://www.macromedia.com/go/getflashplayer"
            src="b.votar.swf" type="application/x-shockwave-flash"
            width="294" quality="best" play="true">

            </object><a
            href="cuenta.voto.php?accion=votar&id=$resultados[id]"
            target="_self"><img src="images/carpeta.gif" alt=""
            height="23" width="32" border="0"><br><br>
HTML;

    }

    echo "</table>";

    mysql_free_result($usuario_consulta);

    mysql_close();
}

?>


</div></td></tr><tr height="15"><td align="center" valign="top" height="15">


<?php

echo "<center><br><font face=Arial size=1 color=white>";

echo $rs->anterior()." | ".$rs->nroPaginas()." | ".$rs->siguiente();

?>

</td></tr></table></td></tr>

<tr><td colspan="2" width="513"><img src="images/conarea_05.jpg"
width="513" height="6"></td></tr></table></td></tr></table></td></tr>

<tr height="21">

<td align="center" width="182" valign="top" height="21"
background="images/brbg2.gif"></td>

<td align="center" width="579" height="21" valign="middle"
background="images/brbg2.gif"><font size="1" face="tahoma, arial">

<?php

$antes = 6389;

echo '<font face=Helvetica size=1 color=White>Datos descargados:<a> ' .
     '<font face=Helvetica size=1 color=Yellow>';

echo round(((ob_get_length()+$antes)/1024)*100)/100;

echo '<font face=Helvetica size=1 color=White></a>kb ';

ob_end_flush();

echo "<font face=Helvetica size=1 color=Yellow>";

echo $_SERVER[HTTP_USER_AGENT];

?>
  #10 (permalink)  
Antiguo 15/07/2003, 17:36
Avatar de nuevo  
Fecha de Ingreso: mayo-2003
Ubicación: Spain
Mensajes: 2.009
Antigüedad: 20 años, 10 meses
Puntos: 2
Gracias leonardo... funcionar funciona perfectamente.. pero me dige mostrando los resultados ordenados igual..... , no se pq, he releido varias veces el codigo que tu has puesto y no veo el error....., si quieres ver el ejemplo te pongo este enlace....

http://217.125.50.214/shadow.top/home2.php

gracias por tu ayuda.... gracias.
__________________
3w.valenciadjs.com
3w.laislatv.com
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:38.