Foros del Web » Programando para Internet » PHP »

Lista complicada

Estas en el tema de Lista complicada en el foro de PHP en Foros del Web. A ver si a alguien se le ocurre algo por que esto me tiene bloqueado… Tengo lo siguiente en una base de datos, son unos ...
  #1 (permalink)  
Antiguo 25/11/2009, 16:26
Avatar de chechu_  
Fecha de Ingreso: mayo-2007
Mensajes: 282
Antigüedad: 16 años, 11 meses
Puntos: 0
Lista complicada

A ver si a alguien se le ocurre algo por que esto me tiene bloqueado…

Tengo lo siguiente en una base de datos, son unos foros y sus hijos, es decir unos foros dentro de otros y me gustaría listarlos de forma dinámica.

Foro1
Foro 2 hijo de Foro1
Foro 3 hijo de Foro2
Foro 4 hijo de Foro1
Foro5
Foro6 hijo de foro5
Foro 7 hijo de foro1
Foro8 hijo de foro 3
Foro9 hijo de foro5
Foro10 hijo de foro5

Me gustaría hacer algo parecido a esto e intento listar los foros una y otra vez con “while” introduciendo una función dentro de sí misma para encontrar sus hijos, pero no lo consigo ya que me da error al listarse demaisado.
  #2 (permalink)  
Antiguo 25/11/2009, 19: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: Lista complicada

1- Como estas generando el listado?
2- Que error te da?
3- Muestra tu codigo para que sea mas facil tratar de ayudarte.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 26/11/2009, 01:59
Avatar de chechu_  
Fecha de Ingreso: mayo-2007
Mensajes: 282
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Lista complicada

Código PHP:
$conectar mysql_connect($server$user$password);
if (!
$conectar) {
    die(
'Imposible conectar: ' mysql_error());
}

mysql_select_db($sdb);


function 
Foro($ID_de_Foro,$array_ID_de_Foro){

$Lista mysql_query('SELECT * FROM foros ');
  if (!
$Lista) {
    die(
'error en query: ' mysql_error());
  }
  
  
$array_ID_de_Foro[] = ' ';
while (
$Foro mysql_fetch_assoc($Lista)) {

if (!
in_array($Foro['id_de_foro'] , $array_ID_de_Foro) and $Foro['id_de_padre'] == $ID_de_Foro){
$ID_de_Foro $Foro['id_de_foro'];

$Nombre_de_Foro $Foro['nombre_de_foro'];

$GLOBALS['array_ID_de_Foro'][] = $ID_de_Foro;


}
Foro($ID_de_Foro,$array_ID_de_Foro);
}



}


$Lista mysql_query('SELECT * FROM foros ');
  if (!
$Lista) {
    die(
'error en query: ' mysql_error());
  }
  
  
$array_ID_de_Foro[] = ' ';
while (
$Foro mysql_fetch_assoc($Lista)) {

if (!
in_array($Foro['id_de_foro'] , $array_ID_de_Foro)){
$ID_de_Foro $Foro['id_de_foro'];

$Nombre_de_Foro $Foro['nombre_de_foro'];

$array_ID_de_Foro[] = $ID_de_Foro;


}
Foro($ID_de_Foro,$array_ID_de_Foro);


Si, vale más un código que mil palabras, no muestra ningún error, sencillamente me falla el navegador, creo que son demasiados listados, no lo tengo muy claro.
  #4 (permalink)  
Antiguo 26/11/2009, 02:20
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: Lista complicada

Tu funcion Foro(...) es recursiva, sin filtros y cada vez que la mandas llamar vuelve a leer todos los foros.

Lo mas facil seria mas o menos asi (adapta las variables):
Código php:
Ver original
  1. // Inicializas la matriz
  2. $foros = array();
  3. $result = mysql_query('SELECT * FROM foros') or die(mysql_error());
  4. while($row = mysql_fetch_assoc($result)) {
  5.     $foro = $row['idforo'];
  6.     $padre = $row['idpadre'];
  7.     // Verificas si ya se creo la matriz para el $padre
  8.     if(!isset($foros[$padre]))
  9.         $foros[$padre] = array();
  10.     // Agregas la informacion del foro donde corresponde
  11.     $foros[$padre][$foro] = $row;
  12. }
  13.  
  14. // Puedes hacer un var_dump($foros); para que veas la estructura
  15. // en $foros[0] quedan solo los foros que no tienen padre (es cero)
  16. // segun tu ejemplo:
  17. //      $foros[0] tendra 1 => datos foro 1, 5 => datos foro 5
  18. //      $foros[1] tendra 2 => datos foro 2,  4 => datos foro 4
  19. //      $foros[2] tendra  3 => datos foro 3
  20. //      etc...
  21.  
  22. echo '<ul>';
  23. listar_foros(0); // Ejecutas la funcion que creara el listado, partiendo del index
  24. echo '</ul>';
  25.  
  26. return;
  27.  
  28. function listar_foros($padre) {
  29.     global $foros;
  30.     foreach($foros[$padre] as $foro => $datos) {
  31.         echo '<li>';
  32.         echo "<a href=\"{$datos['link_del_foro']}\">{$datos['nombre_del_foro_']}</a>";
  33.         // Verificas si el foro tiene "hijos"
  34.         if(isset($foros[$foro])) {
  35.             echo '<ul>';
  36.             listar_foros($foro);
  37.             echo '</ul>';
  38.         }
  39.         echo '</li>';
  40.     }
  41. }
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 26/11/2009, 13:15
Avatar de chechu_  
Fecha de Ingreso: mayo-2007
Mensajes: 282
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Lista complicada

Mil disculpas, igual es que no lo he entendido bien, pero parece que aquí lo que hace es listar todos los foros con sus correspondientes datos y mi idea es que lo liste de la siguiente forma.

Foro1
_____Foro_2
__________Foro_3
_______________Foro8
_____Foro4
_Foro7
Foro5
________Foro6
Foro9
Foro10

Y la información que tengo no son los hijos que tiene cada uno, si no el padre que tienen.

Igual es que no lo comprendo bien…
  #6 (permalink)  
Antiguo 26/11/2009, 13:28
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: Lista complicada

Ciertamente, para crear la matriz se basa en los padres, pero, al hacer el listado, necesitas saber si el foro tiene hijos, de lo contrario, no hay forma de llegar a ellos.

Prueba la primera parte, haz un var_dump() del resultado obtenido y cuando lo hayas entendido, revisa la salida html, se genera con listas no ordenadas (ul) que, al final, dara un resultado mas o menos como lo deseas.
__________________
- León, Guanajuato
- GV-Foto
  #7 (permalink)  
Antiguo 26/11/2009, 15:59
Avatar de chechu_  
Fecha de Ingreso: mayo-2007
Mensajes: 282
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Lista complicada

Correcto, tenías razón, no lo comprendía, funciona perfectamente y me has dejado sin palabras.
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 23:12.