Foros del Web » Programando para Internet » PHP »

Funcion Recursiva

Estas en el tema de Funcion Recursiva en el foro de PHP en Foros del Web. Hola a tod@s, la verdad es que me estoy volviendo loco. Tengo una funcion recursiva para recorrer un arbol que tiene cantidades y necesito sumar ...
  #1 (permalink)  
Antiguo 29/01/2013, 11:26
 
Fecha de Ingreso: enero-2013
Mensajes: 1
Antigüedad: 11 años, 2 meses
Puntos: 0
Pregunta Funcion Recursiva

Hola a tod@s, la verdad es que me estoy volviendo loco.

Tengo una funcion recursiva para recorrer un arbol que tiene cantidades y necesito sumar los valores en sub totales por nivel.
estos serian los datos:

id - parentid - texto -valor

01 - 00 - p1 - 0
02 - 01 - p2 - 5
03 - 02 - p4 - 0
04 - 01 - p5 - 5
05 - 01 - p5 - 0
06 - 05 - p4 - 0
07 - 06 - p5 - 5
08 - 06 - p5 - 5

el resultado deseado:

01 - 00 - p1 - 0 <-- total de todo el arbol
02 - 01 - p2 - 5
03 - 02 - p4 - 0
04 - 01 - p5 - 5
05 - 01 - p5 - 10 <-- total de la rama
06 - 05 - p4 - 10 <-- total de la rama
07 - 06 - p5 - 5
08 - 06 - p5 - 5

el codigo que utilizo es este:

//--------------------------------------------------------------------------------------------
function coge_hours_worked($id) //coge el total de horas asignadas a una wo
{
$db = conecta_bd();

$txtsql="SELECT time_sheet.idwo, Sum(time_sheet.hor_1) AS tot_1, Sum(time_sheet.hor_2) AS tot_2, Sum(time_sheet.hor_3) AS tot_3, Sum(time_sheet.hor_4) AS tot_4, Sum(time_sheet.hor_5) AS tot_5, Sum(time_sheet.hor_6) AS tot_6, Sum(time_sheet.hor_7) AS tot_7 FROM time_sheet GROUP BY time_sheet.idwo HAVING (time_sheet.idwo=".$id.")";

//echo $txtsql;
$rstqry2 = mysql_query($txtsql,$db) or die(mysql_error());
if ($rstqry2) {
$row2= mysql_fetch_assoc($rstqry2);
$tot = $row2["tot_1"] + $row2["tot_2"] + $row2["tot_3"] + $row2["tot_4"] +$row2["tot_5"] + $row2["tot_6"] + $row2["tot_7"];
//mysql_free_result($rstqry2);
}
if ($tot) return $tot; else return 0;
}

//--------------------------------------------------------------------------------------------

function coge_hours_worked_wo($parent,$tot_acumulado) //coge el total de horas trabajadas en una wo y sus hijas
{
$db = conecta_bd();
// retrieve all children of $parent <br>
$txtsql = "SELECT * FROM work_order WHERE idparent=".$parent;
$rstqry = mysql_query($txtsql,$db) or die(mysql_error());
// display each child <br>
while ($row = mysql_fetch_array($rstqry)) {
// indent and display the title of this child <br>
$tot = coge_hours_worked($row["idwo"]);
$tot_acumulado = $tot_acumulado + $tot;

// echo $row["idwo"]." - ".$row["n_work_order"]." - ".$tot." - ".$tot_acumulado." - ". $tot_total ."<br>\n";

// child's children <br>
coge_hours_worked_wo($row["idwo"],$tot_acumulado);
}

$tot_acumulado = $tot_acumulado + coge_hours_worked($parent);
//$tot_total = $tot_total + $tot;
//echo $tot_total."<br>";
return $tot_acumulado;
}
//------------------------------------------------------------------------------------------

coge_hours_worked_wo(1,0)

Alguna sugerencia
  #2 (permalink)  
Antiguo 29/01/2013, 11:36
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Funcion Recursiva

¿Sugerencia de qué?

No explicas nada, solo muestras lo que haces pero no planteas problema alguno.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 29/01/2013, 14:45
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Funcion Recursiva

Una cosa, para que al menos te sea más fácil:
- Si, al fin y al cabo, vas a recorrer todos los elementos del árbol...Te va a ser mucho más sencillo hacer un select de todos los registros, cargarlos en un array, y procesar el array, en vez de hacer queries para cada subnivel, etc.
- Espero que conecta_db no cree una nueva conexión a la base de datos...en cada llamada recursiva.

Etiquetas: funcion, mysql, recursiva, 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:55.