Foros del Web » Programando para Internet » PHP »

Simplificar codigo php

Estas en el tema de Simplificar codigo php en el foro de PHP en Foros del Web. Saludos. He conseguido generar un menú en árbol con checkboxes de hasta 6 niveles y cogiendo los datos de una BBDD Postgresql. Me ha quedado ...
  #1 (permalink)  
Antiguo 20/12/2011, 07:47
 
Fecha de Ingreso: mayo-2011
Mensajes: 11
Antigüedad: 11 años, 3 meses
Puntos: 0
Simplificar codigo php

Saludos. He conseguido generar un menú en árbol con checkboxes de hasta 6 niveles y cogiendo los datos de una BBDD Postgresql. Me ha quedado algo largo y confuso, con varias sentencias repetidas a lo largo de los bucles for anidados. A parte del numero de variables que he tenido que crear. Estoy seguro que pudo simplificarlo por medio de funciones propias, pero no consigo hacerme a la idea de como estructurarlo y lo único que obtengo son fallos en las funciones y al llamarlas. Este es el código tal cual me funciona:

Código PHP:
for ($b=0;$b<count($nivel1gmao);$b++){    //bucle que recorra los elementos del nivel
    
if($nivel1gmao[$b] != null){ //Solo ejecute  valores NO nulos
        
echo '<li><input type="checkbox"/><label>'.$nivel1gmao[$b].'</label><ul>'//Imprime los elementos del nivel
        //Comienzo del nivel 2
        
$selec pg_query($dbconn"select distinct nivel2gmao from inventario where nivel1gmao='".$nivel1gmao[$b]."'"); //En cada pasada del bucle hacemos la solicitud de los elementos hijos de cada elemento del nivel padre
        
while ($selecarr pg_fetch_array($selec,NULL,PGSQL_BOTH)){ $nivel_1[$i] = $selecarr['nivel2gmao'];$i++;}$i=0;
        for(
$c=0;$c<count($nivel_1);$c++){
            echo 
'<li><input type="checkbox"/><label>'.$nivel_1[$c].'</label><ul>';
                    
//Comienzo del nivel 3
                    
$selec pg_query($dbconn"select distinct nivel3gmao from inventario where nivel2gmao='".$nivel_1[$c]."'"); 
                    while (
$selecarr pg_fetch_array($selec,NULL,PGSQL_BOTH)){ $nivel_2[$i] = $selecarr['nivel3gmao'];$i++;}$i=0;
                    for(
$e=0;$e<count($nivel_2);$e++){
                        if(
$nivel_2 != null){
                            echo 
'<li><input type="checkbox"/><label>'.$nivel_2[$e].'</label><ul>';
                                
//comienzo del nivel 4
                                
$selec pg_query($dbconn"select distinct nivel4gmao from inventario where nivel3gmao='".$nivel_2[$e]."'"); 
                                while (
$selecarr pg_fetch_array($selec,NULL,PGSQL_BOTH)){ $nivel_3[$i] = $selecarr['nivel4gmao'];$i++;}$i=0;
                                for(
$f=0;$f<count($nivel_3);$f++){
                                    if(
$nivel_3[$f] != null){
                                        echo 
'<li><input type="checkbox"><label>'.$nivel_3[$f].'</label><ul>';
                                        
//Comienzo del nivel 5
                                        
$selec pg_query($dbconn"select distinct nivel5gmao from inventario where nivel4gmao='".$nivel_3[$f]."'");
                                        while (
$selecarr pg_fetch_array($selec,NULL,PGSQL_BOTH)){ $nivel_4[$i] = $selecarr['nivel5gmao'];$i++;}$i=0;
                                        for(
$h=0;$h<count($nivel_4);$h++){
                                            if(
$nivel_4[$h] != null){
                                                echo 
'<li><input type="checkbox"><label>'.$nivel_4[$h].'</label><ul>';
                                                
//Comienzo del nivel 6 que muestra los elementos
                                                
$selec pg_query($dbconn"select distinct codigocampo from inventario where nivel5gmao='".$nivel_4[$h]."'"); 
                                                while (
$selecarr pg_fetch_array($selec,NULL,PGSQL_BOTH)){ $nivel_5[$i] = $selecarr['codigocampo'];$i++;}$i=0;
                                                for(
$k=0;$k<count($nivel_5);$k++){
                                                    
                                                        echo 
'<li><input type="checkbox"><label>'.$nivel_5[$k].'</label>';
                                                    
                                                }unset(
$nivel_5);
                                            echo 
"</ul>";    
                                            }
//-------
                                            
else{
                                                
$selec pg_query($dbconn"select distinct codigocampo from inventario where (nivel4gmao='".$nivel_3[$f]."' AND nivel5gmao is null)"); 
                                                while (
$selecarr pg_fetch_array($selec,NULL,PGSQL_BOTH)){ $final2[$i] = $selecarr['codigocampo'];$i++;}$i=0;
                                                for(
$j=0;$j<count($final2);$j++){
                                                    if(
$final2[$j] != null){
                                                        echo 
'<li><input type="checkbox"><label>'.$final2[$j].'</label>';
                                                    }
                                                }unset(
$final2);    
                                            }
                                        }unset(
$nivel_4);
                                        echo 
"</ul>";
                                    }
                                    else{
                                        
$selec pg_query($dbconn"select codigocampo from inventario where (nivel3gmao='".$nivel_2[$e]."' AND nivel4gmao is null)"); 
                                        while (
$selecarr pg_fetch_array($selec,NULL,PGSQL_BOTH)){ $final[$i] = $selecarr['codigocampo'];$i++;}$i=0;
                                        for(
$g=0;$g<count($final);$g++){
                                            if(
$final[$g] != null){
                                                echo 
'<li><input type="checkbox"><label>'.$final[$g].'</label>';
                                            }
                                        }unset(
$final);
                                    }
                                }unset(
$nivel_3);
                                echo 
"</ul>";
                        }
                    }unset (
$nivel_2);                                    
            echo 
"</ul>";            
        } unset (
$nivel_1);
        echo 
"</ul>";    
    }
}echo 
"</ul>";
?> 
Esta es una captura del menu:



Me sería de gran ayuda. Gracias

Última edición por controler; 20/12/2011 a las 07:55 Razón: Añadir imagen de muestra
  #2 (permalink)  
Antiguo 20/12/2011, 08:09
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 14 años
Puntos: 1532
Respuesta: Simplificar codigo php

recursion, no hay otro camino
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 20/12/2011, 08:20
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 14 años, 4 meses
Puntos: 326
Respuesta: Simplificar codigo php

No entiendo la extructura que tienes.

La tabla podria ser algo así

id | parent_id | descripcion

Por ejemplo. En vez de tener... ¿nivel2gmao, nivel3gmao, nivel4gmao?

Básicamente, sabiendo el "parent_id" ya sabrias de que elemento depende (q vendría a ser el id del elemento). Todo en la misma tabla, y supongo q con menos campos

Despues, la funcion seria algo así

Código PHP:
genera_menu($parent_id) {
    
$select pg_query($dbconn"select * from inventario where parent_id=$parent_id");
    echo 
'<ul>'//Abrimos la lista
    
while ($selecarr pg_fetch_array($select,NULL,PGSQL_BOTH)) { //Recorremos los resultados
        
echo '<li><input type="checkbox"><label>'.$selecarr['descripcion'].'</label>'//Escribimos el elemento actual
        
genera_menu($selecarra['id']); //Busca más elementos dentro de el
        
echo '</li>';
        }
    echo 
'</ul>'//Cerramos la lista

Yo lo haría algo así.

No quiere decir q sea mejor o peor, pero lo veo más simple (creo). Lo importante es que entiendas la idea que quiero transmitir, no que copies / pegues el código :)

Es una función con recursividad, y la primera llamada debería ser algo así:
Código PHP:
genera_menu(0); 
Además, a tener en cuenta q los elementos "de la raiz", los que no dependen de nadie, parent_id deberia ser 0 ;)
__________________
>> Eleazan's Source
>> @Eleazan
  #4 (permalink)  
Antiguo 20/12/2011, 08:46
 
Fecha de Ingreso: mayo-2011
Mensajes: 11
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Simplificar codigo php

Gracias Eleazan, intentare enfocarlo de esa manera. No se me había ocurrido lo de la columna en la BBDD, ya que me puse a trabajar según me dieron los datos, que son unos pocos (2000 elementos en 38 columnas).
  #5 (permalink)  
Antiguo 20/12/2011, 08:49
 
Fecha de Ingreso: diciembre-2008
Mensajes: 805
Antigüedad: 13 años, 8 meses
Puntos: 20
Respuesta: Simplificar codigo php

Quizas tambien te sirva JSTREE!!

Etiquetas: simplificar, sql, variables
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 04:59.