Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Sumar registros en función recursiva

Estas en el tema de Sumar registros en función recursiva en el foro de PHP en Foros del Web. Que tal Foreros del Web! Hoy les presento una duda de cómo sumar los registros de una consulta en una función recursiva. Les cuento que ...
  #1 (permalink)  
Antiguo 06/09/2014, 01:41
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años, 6 meses
Puntos: 2
Sumar registros en función recursiva

Que tal Foreros del Web!
Hoy les presento una duda de cómo sumar los registros de una consulta en una función recursiva. Les cuento que este suma bien los registros sin ser recursiva.

Este es el código:

Código:
function get_tree($id)
{    
    $result = mysql_query("SELECT * FROM categorias WHERE parent_id='$id'");
    $level = 0;	 
       while ($row = mysql_fetch_array($result))
       {		    	
         /*get_tree($row['id'], $level + 1);*/
        echo str_repeat(' ',$level)';		
       }	
    echo $numero=mysql_num_rows($result);
}

get_tree(6);	

Resultado efectivo:  2
El tema es cuando habilito (le saco los comentarios) la función recursiva del código anterior es que me parecen los resultados correctos pero no sumados, sino de esta forma:

Código:
00112
En vez de "4".
No se cómo decirle a PHP que sume esos valores:
0+0+1+1+2=4

Ya intenté de esta forma:

Código:
$numero=mysql_num_rows($result);
echo array_sum ($numero);
¿Cómo podría solucionarlo, por favor?

Última edición por mikehove; 06/09/2014 a las 01:50
  #2 (permalink)  
Antiguo 06/09/2014, 07:20
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Sumar registros en función recursiva

Debes ir acumulando la suma y devolver el resultado en cada llamada recursiva:

Código PHP:
Ver original
  1. function sum($id) {
  2.   $total = 0;
  3.  
  4.   if ($row->parent) {
  5.     $total += sum($row->parent);
  6.   }
  7.  
  8.   $total += $row->value;
  9.  
  10.   return $total;
  11. }
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 06/09/2014, 11:47
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Sumar registros en función recursiva

Gracias por responder Pateketrueke.
Estoy confundido con tu código, disculpame.
Si este es mi código:

Código:
function get_tree($id)
{    
    $result = mysql_query("SELECT * FROM categorias WHERE parent_id='$id'");
    $level = 0;	 
       while ($row = mysql_fetch_array($result))
       {		    	
         get_tree($row['id'], $level + 1);
        echo str_repeat(' ',$level)';		
       }	
    echo $numero=mysql_num_rows($result);
}

get_tree(6);	

Resultado: 00112 (no se como sumar cada llamada como 0+0+1+1+2=4, que solo diga la suma total=4)
Intenté adaptar tu código, pero me confunde que es "$row->parent", porque me sale algunos errores.
  #4 (permalink)  
Antiguo 06/09/2014, 13:02
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Sumar registros en función recursiva

Seré curioso, pero... si lo que quieres es sumar todos los valores de una columna obtenida en una consulta a la base, ¿por qué no realizas la consulta de modo que obtengas los valroes ya sumados?
A fin de cuenta es una función de agregación básica de SQL: La función SUM()...

¿Para qué hacer algo más complicado que puedes lograr de modos más simples?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 06/09/2014, 15:57
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Sumar registros en función recursiva

Hola gnzsoloyo. Lo que pasa que es una función recursiva de donde no extraigo los valores de una columna de la BD. Se trata de un menú del Modelo Adyacente, donde busco los "hijos" directos de cierto "id":

Código:
function get_tree($id)
{    
    $result = mysql_query("SELECT * FROM categorias WHERE parent_id='$id'");
    $level = 0;	 
       while ($row = mysql_fetch_array($result))
       {      
        echo str_repeat(' ',$level)';		
       }	
    echo $numero=mysql_num_rows($result);
}

Ejemplo:

get_tree(6);

Imprime en pantalla: 2
Si quisiera averiguar también los nietos, bisnietos... de cierto id de la base de datos, agrego, dentro de la función:

Código:
 get_tree($row['id'], $level + 1);
En el mismo caso, imprime en pantalla: "00112". Avisándome que son 4 los descendientes ("hijos") de ese mismo "id"[/CODE].

Código completo:

Código:
function get_tree($id)
{    
    $result = mysql_query("SELECT * FROM categorias WHERE parent_id='$id'");
    $level = 0;	 
       while ($row = mysql_fetch_array($result))
       {		    	
         get_tree($row['id'], $level + 1);
        echo str_repeat(' ',$level)';		
       }	
    echo $numero=mysql_num_rows($result);
}

get_tree(6);	

Resultado: 00112 (no se como sumar cada llamada como 0+0+1+1+2=4, que solo diga la suma total=4)
¿Me explico bien, ahora?
  #6 (permalink)  
Antiguo 06/09/2014, 16:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Sumar registros en función recursiva

Se entiende un poco más, aunque francamente no le veo mucho sentido a lo que haces, pero eso es tu proyecto.
El problema es que yo no veo que estés sumado nada, por lo que jamás obtendrás ese "4". Lo que está haciendo esa función recusiva es obtener cada valor separadamente para luego mostrarlo. Pero no haces operaciones aritméticas con eso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 06/09/2014, 16:18
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Sumar registros en función recursiva

gnzsoloyo, ¿habrá alguna forma para sumar esos valores?

pateketrueke me escribió:

Cita:
function sum($id) {
$total = 0;

if ($row->parent) {
$total += sum($row->parent);
}

$total += $row->value;

return $total;
}
Pero no entiendo qué signica en esas líneas "parent". No comprendo cómo implementarlo en la función recursiva, para que sume los valores:

Cita:
function get_tree($id)
{
$result = mysql_query("SELECT * FROM categorias WHERE parent_id='$id'");
$level = 0;
while ($row = mysql_fetch_array($result))
{
get_tree($row['id'], $level + 1);
echo str_repeat(' ',$level)';
}
echo $numero=mysql_num_rows($result);
}

get_tree(6);

Resultado: 00112 (no se como sumar cada llamada como 0+0+1+1+2=4, que solo diga la suma total=4)

Última edición por mikehove; 06/09/2014 a las 16:27
  #8 (permalink)  
Antiguo 06/09/2014, 16:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Sumar registros en función recursiva

Lo que te ha puesto @paketetrueke en realidad es bastante simple, y no es que se trate de una propiedad mágica o esotérica. Es, a mi entender, un atributo que permite saber que aún hay valores a sumar. Es decir, no es un codigo para que hagas Copy+Paste, sino uno que te oriente en la logica de un cálculo recursivo.

Recordemos que una función recursiva es una función donde dada una condición, se vuelve a invocar a sí misma, con el parámetro de entrada como parámetro de la llamada, creciente o decreciente en función de lo que se necesita.
Además toda función recursiva debe tener un "punto de corte", es decir una salida por else que retorne la cascada de la recursividad al inicio, para devolver el resultado.

En tu ejemplo lo que pareces buscar es saber cuántas subcategorias tiene una categoría dada, considerando que por cada subcategoría podría haber una o mas categorías.

Pero lo que estás haciendo en ningún momento devuelve un valor numérico, sino que retorna una cadena. PAra que PHP te tome el valor devuelto como numero, además de SER un numero, debe realizarse una operación aritmética con él... y eso no lo haces.
Yo probaría algo como:
Código PHP:
Ver original
  1. function get_tree($id) {
  2.     // buscar las categorías
  3.     $result = mysql_query("SELECT * FROM categorias WHERE parent_id='$id'");
  4.     // Declarar una variable numerica
  5.     if ($result)
  6.         {
  7.         if (!isset($level))
  8.             {$level = 0;}
  9.         // Por cada registro obtenido
  10.         if (mysql_num_rows($result) > 0)
  11.             {
  12.             while ($row = mysql_fetch_array($result))
  13.                 {
  14.                 // DEvolvio registros, tiene hijos y los busca
  15.                 $level = $level + get_tree($row['id']);
  16.                 }
  17.             return $level;
  18.             }
  19.        else
  20.            // No devolvio registros.
  21.            {return 0;}
  22.         }
  23.     else
  24.         // Generó error. Sale con cero (esto puede corregirse para detectar errores de MySQL
  25.         {return 0;}
  26. }
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 06/09/2014, 17:16
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Sumar registros en función recursiva

gnzsoloyo tienes razón en la lógica de tu código, muchas gracias.

El resultado de este ejemplo es= "0000" porque agregué un echo en la línea 15 de tu código, mostrando correctamente la cantidad de hijos en ceros.

¿Ahora será seguir con alguna función que cuente la cantidad de ceros y/o me de el resultado de la suma?
Disculpame mi falta de experiencia.

Probé con:
Cita:
echo strlen($level);
Y esto me sale en pantalla: 1111

Pero claro que no es porque devuelve el número de apariciones de un string, y estos son llamadas y numéricas y se necesita una suma.

Ese while tiene la cuestión.
¿Cómo puedo hacer chicos? Les pido su guía por favor...

Última edición por mikehove; 08/09/2014 a las 16:11 Razón: Pedir ayuda
  #10 (permalink)  
Antiguo 09/09/2014, 01:20
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: Sumar registros en función recursiva

Sería una solución chapucera, pero como no entiendo lo que estás haciendo te digo cómo sumar ese string que te resulta:
Código PHP:
Ver original
  1. function get_tree($id)
  2. {
  3.     $result = mysql_query("SELECT * FROM categorias WHERE parent_id='$id'");
  4.     $level = 0;
  5.     $toret = 0;
  6.     while ($row = mysql_fetch_array($result)) {
  7.             $value = get_tree($row['id'], $level + 1);
  8.             $toret += str_repeat(' ',$level) + $value; // se suma el resultado
  9.     }
  10.     $toret += $numero=mysql_num_rows($result); //se suma el número de resultados, no sé por qué.
  11.     return $toret; //valor total retornado
  12. }
  13.  
  14. echo get_tree(6);  //el echo se hace aquí.

Lo que te respondieron por vez primera es la solución más idónea. No hagas "echo" porque eso te pinta el número en pantalla, con lo que no puedes operar matemáticamente con él. Lo que hago es sumarlo en una variable llamada $toret que inicia a cero. Al final se retorna el valor total. Insisto, participo en el tema porque me lo pediste, pero creo que ya te lo han resuelto arriba.

Un saludo y suerte.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #11 (permalink)  
Antiguo 09/09/2014, 10:46
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Sumar registros en función recursiva

CHuLoSoY funciona, gracias!! Me has aliviado la psiquis.
De igual manera me di cuenta que me falta mucho para entender varias cosas en este mundo tan grande y maravilloso de la programación.
También pude adaptar el código, gracias a vos, el de gnzsoloyo, que me ofreció su guía, quedando el suyo así:

Código PHP:
Ver original
  1. function get_tree($id) {
  2.     // Buscar las categorías
  3.     $result = mysql_query("SELECT * FROM categorias WHERE parent_id='$id'");
  4.     //Iniciar suma
  5.     $total = 0;
  6.     // Declarar una variable numerica
  7.     if ($result)
  8.         {
  9.         if (!isset($level))
  10.             {$level = 0;}
  11.         // Por cada registro obtenido
  12.         if (mysql_num_rows($result) > 0)
  13.             {
  14.             while ($row = mysql_fetch_array($result))
  15.                 {
  16.                 // Devolvio registros, tiene hijos y los busca
  17.                 $total +=  $level + get_tree($row['id']);
  18.                 }
  19.             $total += $numero=mysql_num_rows($result); //se suma el número de resultados
  20.             return $total; //valor total retornado
  21.            // return $level;
  22.             }
  23.        else
  24.            // No devolvio registros.
  25.            {return 0;}
  26.         }
  27.     else
  28.         // Generó error. Sale con cero (esto puede corregirse para detectar errores de MySQL
  29.         {return 0;}
  30. }
  31.  
  32. echo get_tree(8);

Quiero agradecer también a pateketrueke, que ha tenido mucha paciencia.
Me cuesta entender...

Saludos!!

Etiquetas: mysql, recursiva, registro, registros, select, sql
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 11:49.