Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: l337* en 26 Junio 2012, 17:09 pm



Título: Menú recursivo con arrays de consulta MySql
Publicado por: l337* en 26 Junio 2012, 17:09 pm
Buen día,

ando bloqueado para crear un menú recursivo utilizando una consulta con los siguientes datos:

Código:
//ejemplo de la primer fila regresada por la consulta sql
Array ( [id] => 12
          [year] => 2012
          [user_id] => 95
          [fecha] => 1340395675
          [ger_id] => 2
          [ad_id] => 4
          [area_especifica] => ghghb
          [cambio_id] => 5
          [prop_id] => 1
          [motivo] => bgb
          [antecedentes] => bghb
          [objetivos] => bghg
          [desc] => bgh
          [beneficios] => bgh
          [bases] => bgh
          [ar_id] => 1
          [ar_info] => bg
          [afect_amb] =>
          [afect_info] => bgh
          [partes_id] => 2
          [apd_id] => 6
          [capac] =>
          [capac_info] => bgh
          [com_riesgos] =>
          [com_info] => bgh
          [status] => EN REVISION
          [tipo_doc] => 0
          [area] => 3 area
          [cambio] => trés bien )

el menú que quiero hacer quedaría así:

Código:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Documento sin título</title>
</head>
<body>
<ul id="grupos">
  <li>year
    <ul>
      <li>area 1
        <ul>
          <li>status 1
            <ul>
              <li>cambio 1
                <ul>
                  <li>id 1</li>
                  <li>id 2</li>
                  <li>id 3</li>
                </ul>
              </li>
            </ul>
          </li>
        </ul>
      </li>
      <li>area 2
        <ul>
          <li>status 2
            <ul>
              <li>cambio 2
                <ul>
                  <li>id 4</li>
                  <li>id 5</li>
                  <li>id 6</li>
                </ul>
              </li>
            </ul>
          </li>
        </ul>
        <ul>
          <li>status 3
            <ul>
              <li>cambio 3
                <ul>
                  <li>id 7</li>
                  <li>id 8</li>
                  <li>id 9</li>
                </ul>
              </li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
  </li>
  <li>year 2
    <ul>
      <li>area
        <ul>
          <li>status
            <ul>
              <li>cambio
                <ul>
                  <li>id 1</li>
                  <li>id 2</li>
                  <li>id 3</li>
                </ul>
              </li>
            </ul>
          </li>
         
        </ul>
      </li>
    </ul>
  </li>
</ul>
</body>
</html>
(http://img163.imageshack.us/img163/7655/menunx.jpg)
como ven, los resultados se agruparían por: Año->area->status->cambio->record .

Qué algoritmo me sugieren para crear esta lista ? considerando que:
- los records siempre estarán a 5 niveles
- el record siempre tiene "varios" parent_id... que vendrían siendo: Año->area->status->cambio, de ahí depende como se agrupa en la lista

la verdad no se me ocurre nada... lo único que había hecho fue:

Código:
    $cYear  = $cArea = $cStatus = $cCambio = "" ;
    $pYear  = $pArea = $pStatus = $pCambio = "" ;
    $html .= '<ul id="group">' ;
    $first = true ;
    $x = 0 ;
    foreach ($result as $d) {
      $html.="<li>".print_r($d)."</li>" ;
      /*if ($first) {
        $cYear = $d['year'] ;
        $html.='<li><a href="#" onclick="return false;">'.$d['year']."</a><ul>\n" ;
      }
      $pYear = $d['year'] ;

     
      $pArea = $d['area'] ;
      if ($pArea != $cArea) {
        $cArea = $d['area'] ;

        $html .= '<li><a href="#" onclick="return false;">'.$d['area']."</a><ul>\n" ;
      }
     
      $pStatus = $d['status'] ;
      if ($pStatus != $cStatus) {
        $cStatus = $d['status'] ;

        $html .= '<li><a href="#" onclick="return false;">'.$d['status']."</a><ul>\n" ;
      }
     
      $pCambio = $d['cambio'] ;
 
      if ($pCambio != $cCambio) {
     
        $cCambio = $d['cambio'] ;
       
        $html .= '<li><a href="#" onclick="return false;">'.$d['cambio']."</a><ul>\n" ;
      }
       
      $html .= "<li>CD-".$d['id']."/".$d['year']."</li>\n"  ;
     
      $first = FALSE ;
      //$x++ ;
      //if ($x==4) break ;*/
    }
    $html .= '</ul>' ;

pero como ven es un desmadre que no tiene nada de bonito....

cualquier sugerencia es agradecida.

gracias



Título: Re: Menú recursivo con arrays de consulta MySql
Publicado por: marko1985 en 26 Junio 2012, 18:09 pm
La verdad que es un poco lío al menos para mí, el cómo lo has explicado.

Tu quieres hacer un menú de 5 niveles si no me he enterado mal, independientemente de los datos que sean tu quieres hacer un menu dentro de otro que en realidad lo que son, son listas UL anidadas ¿Me equivoco? Quizás sería un poco más fácil si nos pones el código exacto por el que extraes esos datos, quizás en la misma extracción es más sencillo imprimir esa lista, inicialmente simplemente con while o con for se podría hacer, pero así explicado no me aclaro mucho.

Intenta simplificarlo un poco que seguro que alguien o yo mismo te ayudaremos con mucho gusto.

Saludos.


Título: Re: Menú recursivo con arrays de consulta MySql
Publicado por: l337* en 26 Junio 2012, 18:26 pm
La verdad que es un poco lío al menos para mí, el cómo lo has explicado.

Tu quieres hacer un menú de 5 niveles si no me he enterado mal, independientemente de los datos que sean tu quieres hacer un menu dentro de otro que en realidad lo que son, son listas UL anidadas ¿Me equivoco? Quizás sería un poco más fácil si nos pones el código exacto por el que extraes esos datos, quizás en la misma extracción es más sencillo imprimir esa lista, inicialmente simplemente con while o con for se podría hacer, pero así explicado no me aclaro mucho.

Intenta simplificarlo un poco que seguro que alguien o yo mismo te ayudaremos con mucho gusto.

Saludos.

1. Así es, un menu (lista ul) que siempre es de 5 niveles. Estos datos siempre los traera el record utilizando el  siguiente query:
Código:
        
$sql = "SELECT f . * , a.nombre AS `area` , tc.nombre AS `cambio` "
             . "FROM `formato` f "
             . "LEFT JOIN `area_dpto` a ON f.ad_id = a.id "
             . "LEFT JOIN `tipo_cambio` tc ON f.cambio_id = tc.id "
             . "ORDER BY `year` DESC , `a`.`nombre` , `status` DESC, `tc`.`nombre`, `f`.`id`" ;
//lo que resulta de esto es el array que puse al principio.
2. Después de ejecutar el query, guardo el resultado en una variable y empiezo el foreach para leer los resultados:
Código:
$result=$db->query($sql) ;
foreach ($result as $d) {
  //aqui es donde quiero crear el ul
 //los datos se leerían: $d['year'].$d['cambio'], etc
}
3. Dentro del foreach es donde necesito "identificar" los padres del record para poder meterlo en el ul li apropiado.
El query ordena los records por año->area->status->cambio->id


mmm.... no sé si así me explico un poco mejor.

gracias