Foros del Web » Programando para Internet » PHP »

funcion recursiva en este codigo

Estas en el tema de funcion recursiva en este codigo en el foro de PHP en Foros del Web. Hola a todos, Lo que estoy intentando hacer es el una ruta de productos dinámica. He conseguido hacer lo que quiero, que es sacar toda ...
  #1 (permalink)  
Antiguo 29/09/2009, 13:36
Avatar de Phoenix23  
Fecha de Ingreso: agosto-2007
Ubicación: 43.286211, -2.171349
Mensajes: 253
Antigüedad: 16 años, 8 meses
Puntos: 1
funcion recursiva en este codigo

Hola a todos,

Lo que estoy intentando hacer es el una ruta de productos dinámica. He conseguido hacer lo que quiero, que es sacar toda la ruta de cada producto pero lo hago haciendo todos los SELECT hasta llegar al nivel 0. Tengo este código donde saco el padre de cada registro hasta llegar al nivel 0 de un tabla que tiene:

Idfamilia, familia, foto, padre, nivel.

Código PHP:
<?php
    
    
include("includes/conexion.php"); 
    
    if (!
$_GET) { ?>
        
        <ul>
          <li class="ultimo"><a href="productos.php" class="ultimo">Productos y Servicios</a></li>
        </ul>
        
      <?php  $familia "Productos y Servicios";
      
    } else {
        
        
$fam $_GET['fam'];
        
$familia $_GET['familia'];
        
        
$sql "SELECT * FROM familia WHERE padre = ".$fam." and familia = '".$familia."'";
        
$res mysql_query ($sql) or die (mysql_error());
        
$fila mysql_fetch_array($res);
    
        if (
$fam == 0) { ?>
            
            <ul>
              <li><a href="productos.php">Productos y Servicios</a></li>
              <li class="ultimo"><a href="#" class="ultimo"><?php echo ucfirst($familia); ?></a></li>
            </ul>
        
         <?php } else if ($fam == 1) {
            
                
$sql2 "SELECT * FROM familia WHERE Idfamilia=".$fila['padre'];
                
$res2 mysql_query($sql2) or die (mysql_error());
                
$fila2 mysql_fetch_array($res2);
                    
            
?>
                <ul>
                  <li><a href="productos.php">Productos y Servicios</a></li>
                  <li class="primero"><a href="productos.php?fam=<?php echo $fila['padre']; ?>&familia=<?php echo $fila['familia']; ?>"><?php echo $fila['familia']; ?></a></li>
                  <li class="ultimo"><a href="#" class="ultimo"><?php echo $familia?></a></li>
                </ul>
         
        <?php } else if ($fam == 3) {
            
                
$sql2 "SELECT * FROM familia WHERE Idfamilia=".$fila['padre'];
                
$res2 mysql_query($sql2) or die (mysql_error());
                
$fila2 mysql_fetch_array($res2);
            
                
$sql3 "SELECT * FROM familia WHERE Idfamilia=".$fila2['padre'];
                
$res3 mysql_query($sql3) or die (mysql_error());
                
$fila3 mysql_fetch_array($res3);
                
                
$sql4 "SELECT * FROM familia WHERE Idfamilia=".$fila3['padre'];
                
$res4 mysql_query($sql4) or die (mysql_error());
                
$fila4 mysql_fetch_array($res4);
            
?>
                
                <ul>
                  <li><a href="productos.php">Productos y Servicios</a></li>
                  <li class="primero"><a href="productos.php?fam=<?php echo $fila3['padre']; ?>&familia=<?php echo $fila3['familia']; ?>"><?php echo $fila3['familia']; ?></a></li>
                  <li class="segundo"><a href="productos.php?fam=<?php echo $fila2['nivel']; ?>&familia=<?php echo $fila2['familia']; ?>"><?php echo $fila2['familia']; ?></a></li>
                  <li class="ultimo"><a href="#" class="ultimo"><?php echo $familia?></a></li>
                </ul>
                
        <?php } else if ($fam == 5) {
            
                
$sql2 "SELECT * FROM familia WHERE Idfamilia=".$fila['padre'];
                
$res2 mysql_query($sql2) or die (mysql_error());
                
$fila2 mysql_fetch_array($res2);
            
                
$sql3 "SELECT * FROM familia WHERE Idfamilia=".$fila2['padre'];
                
$res3 mysql_query($sql3) or die (mysql_error());
                
$fila3 mysql_fetch_array($res3);
                
                
$sql4 "SELECT * FROM familia WHERE Idfamilia=".$fila3['padre'];
                
$res4 mysql_query($sql4) or die (mysql_error());
                
$fila4 mysql_fetch_array($res4);
                
            
?>
                
                <ul>
                  <li><a href="productos.php">Productos y Servicios</a></li>
                  <li class="segundo"><a href="productos.php?fam=<?php echo $fila4['padre']; ?>&familia=<?php echo $fila4['familia']; ?>"><?php echo $fila4['familia']; ?></a></li>
                  <li class="tercero"><a href="productos.php?fam=<?php echo $fila3['padre']; ?>&familia=<?php echo $fila3['familia']; ?>"><?php echo $fila3['familia']; ?></a></li>
                  <li class="tercero"><a href="productos.php?fam=<?php echo $fila2['padre']; ?>&familia=<?php echo $fila2['familia']; ?>"><?php echo $fila2['familia']; ?></a></li>
                  <li class="ultimo"><a href="#" class="ultimo"><?php echo $familia?></a></li>
                </ul>
                
        <?php 
        
    }
?>
Lo que no puedo hacer es estar haciendo todo el rato SELECT. Tengo una función recursiva , que es esta:


Código PHP:
<?php
//Enlace de la pagina donde estaba: http://javiro.com/funcion-recursiva-para-generar-un-arbol-de-categorias-accesible/;
//Enlace del jquery tree: http://docs.jquery.com/Downloading_jQuery

include ("conexion.php");

//se declara la variable global $nivel para tener una referencia fuera de la función recursiva que indique el nivel de profundidad de subfamilia actual
$nivel "";
global 
$nivel;
///funcion recursiva que recorre el menu

function recorrer_menu_familias($padre$nivel_anterior){
    
    
//la consulta a la tabla familias busca los hijos del padre que entró como parametro a esta función
    
$sql="SELECT Idfamilia, familia, nivel, padre FROM familia WHERE padre = $padre";   
    
$result=mysql_query($sql);
    
    while(
$row mysql_fetch_array($result)){
        
        
$clase $row['nivel'];
        
        switch (
$clase) {
            case 
0:
                
$clase_fin "clase1";
                
$span_folder "folder";
                break;
            case 
1:
                
$clase_fin "clase2";
                
$span_folder "folder2";
                break;
            case 
2:
                
$clase_fin "clase3";
                
$span_folder "folder3";
                break;
            case 
3:
                
$clase_fin "clase4";
                
$span_folder "folder4";
                break;
        }
        
        if(
$GLOBALS['nivel']==""){
            
//si la goblal nivel está vacia es que acaba de empecar el ciclo recursivo
            
echo "<li class= 'closed $clase_fin'>";
        }else{
            
//según la diferencia de nivel actual con el anterior guardada en $GLOBALS['nivel'] se cierran o abren etiquetas <Li>
            
$diferencia $row['nivel'] - $GLOBALS['nivel'];
            if(
$diferencia==0) echo "</li>\n<li class='closed $clase_fin'>\n"//no ha cambiado de nivel de subfamilia respecto al anterior
            
if($diferencia==1) echo "<ul>\n<li class='closed $clase_fin'>\n"//ha subido un nivel de subfamilia respecto al anterior
            
if($diferencia==-1) echo "</span></li>\n</ul>\n<li class='closed $clase_fin'>\n"//ha bajado un nivel de subfamilia respecto al anterior
            
if($diferencia < (-1)){
                
//baja varios niveles de subfamilia respecto al anterior
                
echo "</span></li>";
                for(
$i>=$diferencia;$i<0;$i++)
                    echo 
"</ul>\n</li>\n"
                echo 
"<li class='closed $clase_fin'>\n";
            }
        }
        
//crea el enlace
        
        
$padre2 $row['padre'];
        
$familia $row['familia'];
        echo 
"<div class='hitarea'><a href='productos.php?fam=$padre2&familia=$familia' class=$span_folder $clase_fin><span class='$span_folder'><span class='espacio'>".$row['familia']."</span></span></a></div>";
        
        
//actualiza $GLOBALS['nivel'] al nivel actual
        
$GLOBALS['nivel'] = $row['nivel'];
        
//se llama a si mismo para comprovar quienes son los hijos de la familia actual
        
recorrer_menu_familias($row['Idfamilia'],$row['nivel']);
    }
}
//muestra menu
function muestra_menu_familias(){
    
recorrer_menu_familias(0"");
    echo 
"</li>\n";
    for(
$i=0;$i==$GLOBALS['nivel'];$i++)
        echo 
"</ul>\n</li>\n";
}
?>
<div id="main">
    <ul id="browser" class="filetree">
        <?php muestra_menu_familias(); ?>
    </ul>
</div>
Lo que me gustaria seria unir este código y la función recursiva.

Gracias de antemano y saludos
  #2 (permalink)  
Antiguo 29/09/2009, 14:28
Avatar de rudy69  
Fecha de Ingreso: octubre-2008
Ubicación: espndeportes.com
Mensajes: 195
Antigüedad: 15 años, 6 meses
Puntos: 7
Respuesta: funcion recursiva en este codigo

Vi por ahi que repites mucho los codigos, deberias crear todas las funciones que necesites, para ahorrar codigo(a unos no les gusta que lo diga asi xD), osea trabajo.

Código PHP:
                $sql2 "SELECT * FROM familia WHERE Idfamilia=".$fila['padre']; 
                
$res2 mysql_query($sql2) or die (mysql_error()); 
                
$fila2 mysql_fetch_array($res2); 
             
                
$sql3 "SELECT * FROM familia WHERE Idfamilia=".$fila2['padre']; 
                
$res3 mysql_query($sql3) or die (mysql_error()); 
                
$fila3 mysql_fetch_array($res3); 
                 
                
$sql4 "SELECT * FROM familia WHERE Idfamilia=".$fila3['padre']; 
                
$res4 mysql_query($sql4) or die (mysql_error()); 
                
$fila4 mysql_fetch_array($res4); 

podria ser asi:

Código PHP:
function MuchosSelect($filaPadre) {
    
$result mysql_query("SELECT * FROM familia WHERE Idfamilia=" $filaPadre) or die (mysql_error());
    return 
mysql_fetch_array(;$result);
}
$filaX MuchosSelect($fila3['padre']); 
aunque yo lo haria de otra manera, pero lo pongo asi para que entiendas mi sugerencia

Última edición por rudy69; 29/09/2009 a las 14:31 Razón: Le faltaba algo
  #3 (permalink)  
Antiguo 29/09/2009, 14:39
Avatar de Phoenix23  
Fecha de Ingreso: agosto-2007
Ubicación: 43.286211, -2.171349
Mensajes: 253
Antigüedad: 16 años, 8 meses
Puntos: 1
Respuesta: funcion recursiva en este codigo

hola rudy69,

Gracias por tu respuesta, pero la cuestión no es hacer una funcion por cada SELECT.
Lo que quiero es hacer una funcion recursiva que me calcule y haga todos los SELECT que le hagan falta para recorrer cada familia, subfamilia, sub-subfamilia....

Saludos
__________________
"La vida se mide por las veces que te levantas, no por las veces que te caes"

visita zarautz!!!
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 21:11.