Foros del Web » Programando para Internet » PHP »

Estructura de arbol

Estas en el tema de Estructura de arbol en el foro de PHP en Foros del Web. Hola chicos !!! estoy tratando de resolver un problema con una estructura de arbol y encontre este foro q esta muy padre, pero aun no ...
  #1 (permalink)  
Antiguo 23/02/2012, 14:24
 
Fecha de Ingreso: febrero-2012
Mensajes: 1
Antigüedad: 12 años, 2 meses
Puntos: 0
Pregunta Estructura de arbol

Hola chicos !!! estoy tratando de resolver un problema con una estructura de arbol y encontre este foro q esta muy padre, pero aun no logro decifrar mi problema espero me puedan dar una manita con esto:

me he hecho bolas tratando de desifrar como estructurar esto dinamicamente, tengo una tabla con categorias padres e hijas y llamo la estructura con esta funcion recursiva asi:

Código PHP:
function crearArbol($tabla,$id_field,$show_data,$link_field,$parent,$prefix){
    
/*Armar query*/
    
$sql='select * from '.$tabla.' where '.$link_field.'='.$parent;
 
    
/*Asumiendo que se usa MySQL (se puede cambiar facilmente a otra db)*/
 
    
$rs=@mysql_query($sql);
    if(
$rs){
           
/*Recorrer todos las entradas */
           
while($arr=mysql_fetch_array($rs)){
        
/* Imprimir campo a mostrar*/
                
$menu.= $prefix.$arr[$show_data];
 
        
/* imprimir arbol the "hijos" de este elemento*/
                
crearArbol($tabla,$id_field,$show_data,$link_field,$arr[$id_field],$prefix.$prefix);
           }
    }    


hasta ahi todo bien, pero lo que quiero lograr y no puedo es que la estructura quede dentro de varias listas anidadas al final tendria que ser algo asi:

Código PHP:
<ul>
<
li>categoria 1</li>
<
li>categoria 2</li>
<
li>categoria 3
   
<ul>
   <
li>sub-categoria 1</li>
   <
li>sub-categoria 2
           
<ul>
              <
li>sub-sub-categoria 1</li>
              <
li>sub-sub-categoria 2</li>
           </
ul>
   </
li>
   <
li>sub-categoria 3</li>
</
ul>
</
li>
<
li>categoria 4</li>
<
li>categoria 5</li>
</
ul
y asi sucesivamente por n cantidad de niveles, ojala me entiendan chicos y me den una ayuda con este problemota, que ya he pasado 10 noches en vela y no lo resuelvo

espero su ayuda gracias
  #2 (permalink)  
Antiguo 23/02/2012, 14:58
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: Estructura de arbol

Yo tengo algo parecido a lo que necesitas aqui el código...
Es parte de una clase... con algunos cambios y quizás te funcione...

Código PHP:
Ver original
  1. public function generarMenu()
  2.     {   // Inicio Carga de Categorias
  3.         $config         = Config::singleton();
  4.         $tabla          = $config->get('tabla');
  5.         $campoId        = $config->get('campoId');
  6.         $categoria      = $config->get('categoria');
  7.         $relacion       = $config->get('relacion');
  8.         $padre          = 0;
  9.         $prefijo        = '-';
  10.         $this->arbolJerarquico($tabla,$campoId,$categoria,$relacion,$padre,$prefijo);
  11.         $nivelAnterior  = 0;
  12.         // INTERACTIVIDAD DEL MENU //
  13.         $menuHTML       = '<div id="treecontrol">'."\n";
  14.         $menuHTML       .='<a title="Collapsar Menu" href="#">Colapsar</a> |' . "\n";
  15.         $menuHTML       .='<a title="Expandir Menu" href="#"> Expandir</a> |' . "\n";
  16.         $menuHTML       .='<a title="Alternar Menu" href="#"> Alternar</a>' . "\n";
  17.         $menuHTML       .='</div>' . "\n";
  18.         $menuHTML       .="\n\n<ul id='gray' class='treeview-gray'>\n";
  19.        
  20.         foreach($this->categorias as $valor)
  21.         {   $nivel      = $this->calcularNivel($valor['prefijo'],$prefijo);
  22.             switch($valor['padre'])
  23.             {   case 'Si':
  24.                     if($nivel==$nivelAnterior )
  25.                     {   $menuHTML   .='<li class="closed"><a href="index.php?mdl=catalogo&amp;ctr=Ver&amp;acc=categoria&amp;id=' . $valor['id'] . '" >' . $valor['categoria'] . "</a>\n";   }
  26.                     elseif($nivel>$nivelAnterior)
  27.                     {   $menuHTML   .='<ul><li class="closed"><a href="index.php?mdl=catalogo&amp;ctr=Ver&amp;acc=categoria&amp;id=' . $valor['id'] . '" >' . $valor['categoria'] . "</a>\n";   }
  28.                     else
  29.                     {   $menuHTML   .='</ul></li><li class="closed"><a href="index.php?mdl=catalogo&amp;ctr=Ver&amp;acc=categoria&amp;id=' . $valor['id'] . '">' . $valor['categoria'] . "</a>\n";  }
  30.                     break;
  31.                 case 'No':
  32.                     if($nivel==$nivelAnterior) 
  33.                     {   $menuHTML   .='<li><a href="index.php?mdl=catalogo&amp;ctr=Ver&amp;acc=categoria&amp;id=' . $valor['id'] . '">' . $valor['categoria'] . '</a></li>' . "\n"; }
  34.                     elseif($nivel<$nivelAnterior)
  35.                     {   $cierroUl   = str_repeat('</ul></li>',$nivelAnterior-$nivel);
  36.                         $menuHTML   .=$cierroUl.'<li><a href="index.php?mdl=catalogo&amp;ctr=Ver&amp;acc=categoria&amp;id=' . $valor['id'] . '" >' . $valor['categoria'] . '</a></li>' . "\n";  }
  37.                     else
  38.                     {   $menuHTML   .='<ul><li><a href="index.php?mdl=catalogo&amp;ctr=Ver&amp;acc=categoria&amp;id=' . $valor['id'] . '">' . $valor['categoria'] . '</a></li>' . "\n"; }              
  39.                     break;
  40.             }
  41.             $nivelAnterior  = $nivel;
  42.         }
  43.         $menuHTML       .="</ul>\n\n";
  44.         $fp = fopen('../opet/menu/menuPublico.html' ,"w+");
  45.         fputs($fp,$menuHTML);
  46.         fclose($fp);
  47.         echo $menuHTML;
  48.     }
  49.  
  50.  
  51.     public function arbolJerarquico($tabla,$campoId,$categoria,$relacion,$padre,$prefijo='-')
  52.     {   $objCategorias  = new CategoriasModelo();
  53.         $categorias     = $objCategorias->generarArbolCategorias($tabla,$relacion,$padre);
  54.         if($categorias)
  55.         {   $filas      = $categorias->fetch_object();
  56.             while($filas)
  57.             {   $this->categorias[]['id']               = $filas->$campoId;
  58.                 $cnt    = count($this->categorias)-1;
  59.                 $this->categorias[$cnt]['prefijo']      = $prefijo;
  60.                 $this->categorias[$cnt]['categoria']    = $filas->$categoria;
  61.                 $this->categorias[$cnt]['padre']        = $filas->padre;
  62.                 $this->arbolJerarquico($tabla,$campoId,$categoria,$relacion,$filas->$campoId, $prefijo . $prefijo);
  63.                 $filas      = $categorias->fetch_object();
  64.             }
  65.         }
  66.     }

Esta es mi tabla MySQL
Código SQL:
Ver original
  1. CREATE TABLE `categorias` (
  2.     `idCategoria` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  3.     `nombreCategoria` VARCHAR(60) NOT NULL,
  4.     `idCategoriaPadre` SMALLINT(6) NULL DEFAULT '0' COMMENT 'Nos refleja si es hijo de una categoria o es padre(0).',
  5.     `imagenCategoria` VARCHAR(150) NULL DEFAULT NULL,
  6.     `padre` SET('No','Si') NOT NULL DEFAULT 'No',
  7.     `descripcionCategoria` VARCHAR(1000) NULL DEFAULT NULL,
  8.     PRIMARY KEY (`idCategoria`)
  9. )
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp

Última edición por portalmana; 23/02/2012 a las 15:07
  #3 (permalink)  
Antiguo 27/02/2012, 02:19
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Estructura de arbol

Sin ver las tablas es difícil saber si funciona o no, supongo que la select está bien, pero la función no devuelve nada y el código tiene algunos fallos. Aquí tienes un ejemplo completo con tablas y datos para probar que resuelve el problema que tú tienes de forma recursiva:

http://barcoavenus.blog.com/2011/01/...ecursivamente/

Espero sirva, saludos
__________________
Fere libenter homines, id quod volunt, credunt.

Etiquetas: estructura, mysql, sql, tabla, arboles
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 19:26.