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. Buenas, directo al grano! tengo una tabla Código: categorias . ID_cat . nombre . padre las filas serian ID_cat (identificador) nombre (nombre de la categoria) ...
  #1 (permalink)  
Antiguo 07/02/2007, 09:48
 
Fecha de Ingreso: mayo-2004
Ubicación: Barcelona
Mensajes: 200
Antigüedad: 20 años, 6 meses
Puntos: 0
Funcion recursiva

Buenas,

directo al grano!

tengo una tabla

Código:
categorias
  . ID_cat
  . nombre
  . padre
las filas serian
ID_cat (identificador) nombre (nombre de la categoria) padre (identificador del padre, osea un ID_cat)

Ej:

Código:
 1    -   Abuelo -  0
 2    -   Padre -   1
 3    -   Nieto -    2
 4    -   pringao - 2
 5    -   otro    -  3
Q: mi problema es como obtener todos lo hijos de una categoria y los hijos de los hijos!!!..

EJ: como obtener todos los hijos de la categoria padre y tamb los hijos de los hijos de padre
osea:

padre(2) -> nieto(3) -> otro(5)
-> pringao(4)

he intentado hacer esto pero no funciona del to,

Código PHP:
       // con este select, obtendria los hijos de la categoria
       
$_sql_cat "Select ID_cat from categorias where padre =".$ID_cat;
        
    
$resultado mysql_query($_sql_cat) or die(mysql_error());
    
$num mysql_num_rows($resultado);
        
    
// Inicio un array, para guardar los Ids de las categorias
    
$cats = array ($ID_cat);
    
    if(
$num  != 0)
    {
        while(
$linea mysql_fetch_array($resultado))
        {
            
// Hijo
            
$aux_hijo $linea['ID_cat'];        

                     
// Añadir al array el ID del hijo
            
$cats[] = $aux_hijo;

       
/* Aqui haria otro select para aberiguar los hijos del hijo...( q lio :P)
           
            EL PROBLEMA: es que pasa si este hijo tamb tiene hijos¿?
                 no puedo hacer whiles "manuales" porq
                 no hay limite de hijos y subhijos,  entonces como puedo hacer este bucle ¿?*/

               
}
         } 
espero haberme explicado minimamente bien, es un lio con tantos hijos!!



Gracias, de antemano ;)

Última edición por fido85; 08/02/2007 a las 02:30
  #2 (permalink)  
Antiguo 07/02/2007, 10:03
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 19 años, 4 meses
Puntos: 6
Re: Bucle sql indefinido

si mal no recuerdo en las FAQS hay un codigo, habria que buscarlo ;)

Basicamente es una funcion recursiva que busca los hijos de un nodo, y los hijos de los hijos, etc.


Saludos,
__________________
Federico.

Mi página: www.jourmoly.com.ar
  #3 (permalink)  
Antiguo 08/02/2007, 02:55
 
Fecha de Ingreso: mayo-2004
Ubicación: Barcelona
Mensajes: 200
Antigüedad: 20 años, 6 meses
Puntos: 0
Re: Funcion recursiva

he estado buscando en las FAQ'S pero NO he encontrado nada :(

alguna otra opcion¿?

Gracias
  #4 (permalink)  
Antiguo 08/02/2007, 03:40
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 7 meses
Puntos: 1284
Re: Funcion recursiva

Hola:

Ho uso una función recursiva como un receptor universal de formularios: receptor.php (puse un parámetro de prueba en la url)...

Y el código es:

Código:
<? session_start(); ?>
<html>
<body>
<?
function listado($descriptor, $objeto, $nivel) {
	echo "<u>$descriptor</u>:<br/>\n";
	echo "<div style='border: 1px solid gray; margin-left: 1cm'>Datos $descriptor: (nivel: $nivel)<br />\n";
	foreach ($objeto as $item => $dato)	{
		echo "$item = $dato <br />";
		if (is_Array($dato) && ($nivel < 5) && ($item != $descriptor))
			listado($descriptor."[ ".$item." ]", $dato, $nivel + 1);
	}
	echo "</div>";
}

listado ("GET", $_GET, 0);
echo "<hr />";
listado ("POST", $_POST, 0);
echo "<hr />";
listado ("FILES", $_FILES, 0);
//echo "<hr />";
//listado ("SESSION", $_SESSION, 0);

?>
</body>
</htnl>
Este caso solo muestra datos, pero si se quiere asignar datos de forma recursiva se complica algo...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #5 (permalink)  
Antiguo 08/02/2007, 07:52
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 20 años
Puntos: 34
Re: Funcion recursiva

Acá tenes un thread donde deje ejemplo muy similar al tuyo.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #6 (permalink)  
Antiguo 08/02/2007, 08:10
 
Fecha de Ingreso: mayo-2004
Ubicación: Barcelona
Mensajes: 200
Antigüedad: 20 años, 6 meses
Puntos: 0
Re: Funcion recursiva

Gracias nicolaspar

es justo lo q necesitaba.

Saludos

PD: gracias a todos por responder, la funcion de caricatos esta muy interesante :D
  #7 (permalink)  
Antiguo 08/02/2007, 10:21
 
Fecha de Ingreso: mayo-2004
Ubicación: Barcelona
Mensajes: 200
Antigüedad: 20 años, 6 meses
Puntos: 0
Mensaje Re: Funcion recursiva

Otro problema :S

de que forma puedo guardar los ID's, para posteriormente utilizarlos¿?


Cita:
Iniciado por nicolaspar Ver Mensaje


Código PHP:
function arbol$parent ){
    
$r mysql_query"SELECT * FROM categorias where parent ='$parent' " );
    while( 
$rs mysql_fetch_assoc$r ) ){
        
        
// Array con los ID ¿?

        
arbol$rs["id"] );
    } 
mysql_free_result$r );
}
arbol); 

Gracias,
  #8 (permalink)  
Antiguo 08/02/2007, 11:22
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 20 años
Puntos: 34
Re: Funcion recursiva

No decís con que estructura necesitas el array y para que, pero la idea sería que lo hagas fuera de la función, algo así:
Código PHP:

$categoriasArray 
= array();
$r mysql_query"SELECT id, nombre FROM categorias " ); 
while( 
$rs mysql_fetch_row$r ) ) $categoriasArray[$rs[0]] = $rs[1];


function 
arbol$parent ){ 
   
$r mysql_query"SELECT * FROM categorias where parent ='$parent' " ); 
    while( 
$rs mysql_fetch_assoc$r ) ){ 
        
arbol$rs["id"] ); 
    } 
mysql_free_result$r ); 

arbol); 
__________________
Mi punto de partida es Que Bueno Lo Nuevo
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.
Tema Cerrado

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 21:59.