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 todos, Estoy trabajando en esta función recursiva pero no me funciona a partir del segundo nivel, y me estoy volviendo loco . Os ...
  #1 (permalink)  
Antiguo 30/12/2009, 02:40
Avatar de Phoenix23  
Fecha de Ingreso: agosto-2007
Ubicación: 43.286211, -2.171349
Mensajes: 253
Antigüedad: 16 años, 7 meses
Puntos: 1
Funcion recursiva

Hola a todos,

Estoy trabajando en esta función recursiva pero no me funciona a partir del segundo nivel, y me estoy volviendo loco . Os agradeceria muchisimo si pudieseis echarle un vistazo. Este el código que tengo:
Código PHP:
function recursiva($id_padre, $familia){
     
    $sql_rec = "SELECT * FROM subfam WHERE familia LIKE '$familia' AND Subfadep LIKE '$id_padre'";
    $res_rec = mysql_query($sql_rec);
        
    $folder=1;
        
   if ($res_rec){ ?>
            
          <ul>
          
            <?php while($fila_rec mysql_fetch_array($res_rec)){ ?>
            
           <?php $folder $folder 1?>
            
    <li class="closed">
         <span class="folder<?php echo $folder?>"><a href="#"><?php echo htmlentities($fila_rec["Descripcio"]);?></a></span>  
    </li>
           
    <?php recursiva($fila_rec["Subfamilia"], $familia); ?>
                 
                
    <?php }?>
            
          </ul>

         <?php }

      } 
?>

  <?php 
  
function rellenar_recursivo() {    
 
    
$sql="SELECT * FROM tablaart";   
    
$res=mysql_query($sql) or die (mysql_error());
    
    if (
$res){ ?>
        
        <?php while($fila mysql_fetch_array($res)){ ?>
            
                        
            <?php 
            
                $sql2
="SELECT * FROM subfam WHERE familia LIKE '{$fila['Codigo']}' AND (Subfadep LIKE '' OR Subfadep IS NULL)";   
                
$res2=mysql_query($sql2); 
                
            
?>
         
            <?php if ($res2){ ?>
                
                <ul>
             
                <?php while($fila2 mysql_fetch_array($res2)){ ?> 
                        
                    <li class="closed">               
                       <span class="folder"><a href="#" class="clase1"><?php echo htmlentities($fila2['Descripcio']); ?></a></span>
                        
                    <?php recursiva($fila2['Subfamilia'], $fila['Codigo']); ?>
                    </li>
                
                <?php }  ?>
                
                </ul>
        
            <?php }
            
        
         } 
            
    } 
  
 } 
 
?>

<div id="main">
    <ul id="browser" class="filetree">
     
      <?php rellenar_recursivo(); ?>
    
    </ul>
</div>
Gracias a todos de antemano y saludos
__________________
"La vida se mide por las veces que te levantas, no por las veces que te caes"

visita zarautz!!!
  #2 (permalink)  
Antiguo 30/12/2009, 04:34
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Funcion recursiva

Es mejor hacer una sola consulta y cargar todo en una matriz, aqui un ejemplo que te puede servir: http://www.forosdelweb.com/f18/lista...2/#post3181868
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 30/12/2009, 05:40
Avatar de Phoenix23  
Fecha de Ingreso: agosto-2007
Ubicación: 43.286211, -2.171349
Mensajes: 253
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Funcion recursiva

Gracias por la pronta Respuesta Triby,

Pero me sale el siguiente error, Invalid argument supplied for foreach(). Se que es porke puede estar vacio, pero se que el array no esta vacio. No se, yo creo que ya llevo tanto tiempo con este menu que ya no me rula demasido la cabeza .

Gracias de antemano y saludos
__________________
"La vida se mide por las veces que te levantas, no por las veces que te caes"

visita zarautz!!!
  #4 (permalink)  
Antiguo 30/12/2009, 11:20
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

Phoenix23, estas equivocado... el error "Invalid argument supplied for foreach()" se da simplemente porque el argumento pasado no es un array()

incluso, puede estar vacío y no hay problema siempre y cuando sea un arreglo...

esa es la verdad... ahora te toca reflexionar, suerte!!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 31/12/2009, 05:58
Avatar de Phoenix23  
Fecha de Ingreso: agosto-2007
Ubicación: 43.286211, -2.171349
Mensajes: 253
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Funcion recursiva

Hola pateketrueke,

Este es el código que me recomendo Triby:

Código PHP:
<?php

include ("menu_arbol/demo/conexion.php");

// Inicializas la matriz
$familia = array();

$result mysql_query('SELECT * FROM subfam') or die(mysql_error());
while(
$row mysql_fetch_assoc($result)) {
    
$idFamilia $row['Familia'];
    
$descri $row['Descripcio'];
    
// Verificas si ya se creo la matriz para el $padre
    
if(!isset($familia[$descri]))
        
$familia[$descri] = array();
    
// Agregas la informacion del foro donde corresponde
    
$familia[$descri][$fam] = $row;
}
 
// Puedes hacer un var_dump($foros); para que veas la estructura
// en $foros[0] quedan solo los foros que no tienen padre (es cero)
// segun tu ejemplo:
//      $foros[0] tendra 1 => datos foro 1, 5 => datos foro 5
//      $foros[1] tendra 2 => datos foro 2,  4 => datos foro 4
//      $foros[2] tendra  3 => datos foro 3
//      etc...
 
echo '<ul>';
listar_foros(0); // Ejecutas la funcion que creara el listado, partiendo del index
echo '</ul>';
 
return;
 
function 
listar_foros($idFamilia) {
    
    
$familia=array();
    
$arti = array();
    
    foreach(
$familia[$descri] as $arti => $datos) {
        echo 
'<li>';
        echo 
"<a href=\"{$datos['link_del_foro']}\">{$datos['nombre_del_foro_']}</a>";
        
// Verificas si el foro tiene "hijos"
        
if(isset($familia[$arti])) {
            echo 
'<ul>';
            
listar_foros($idFamilia);
            echo 
'</ul>';
        }
        echo 
'</li>';
    }
}

?>
y me da el error de Warning: Invalid argument supplied for foreach() in ...
Lo que no se es porque. LLevo toda la mañana y no lo entiendo.

Saludos y que termineis bien el año y empeceis mejor el siguiente
__________________
"La vida se mide por las veces que te levantas, no por las veces que te caes"

visita zarautz!!!
  #6 (permalink)  
Antiguo 31/12/2009, 10:02
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 17 años, 9 meses
Puntos: 19
Respuesta: Funcion recursiva

Código PHP:
Ver original
  1. $familia=array();
  2. $arti = array();

Al hacer eso estas vaciando los arrays!, creo que nunca vas a tener datos mientras hagas eso!

si queres forzar el tipo array hace algo como

Código PHP:
Ver original
  1. (array)$familia;
  2. (array)$arti;

En caso de que ya sean array no se perderan sus datos!

Y luego, en esta linea
Código PHP:
Ver original
  1. foreach($familia[$descri] as $arti => $datos) {

Estas seguro que $familia[$descri] continene un array??

de otra forma en los casos en que no lo sea, esta seria una solucion precaria (no optima) a tu error
Código PHP:
Ver original
  1. foreach((array)$familia[$descri] as $arti => $datos) {
  #7 (permalink)  
Antiguo 31/12/2009, 10:40
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

Phoenix23 lo que sucede es que tu función esta incompleta...

¿de donde estas obteniendo $descri ???

y peor aún... ¿de donde sacas los datos (porque no se ve)??
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
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 10:07.