PHP / MySQL: Multi-nivel del árbol de categorías

  • tsanthoshk
  • Born
  • Born
  • No Avatar
  • Registrado: Feb 20, 2007
  • Mensajes: 1
  • Status: Offline

Nota Febrero 20th, 2007, 11:44 pm

akazdenko escribió:
con ligeros cambios ive obtuvo lo que necesito :)

gracias a todos y cada uno que la prestación de este código a fin de que mi tarea llegar a ser muy simple.
Estoy buscando este tipo de código. Por último, me tengo.

Pero estoy tratando de cambiar este código con la población de la matriz en lugar de hacer una llamada recursiva
a DB. Una vez que hemos recibido el conjunto de datos en un array. Después de rellenar la matriz hacerlos como por nuestras necesidades.
Por lo tanto, ese proceso se vuelven muy rápidamente. Si hay 1000 de las categorías. entonces va a ser un problema para la
sistema de rendimiento.



CYA
  • Anonymous
  • Bot
  • No Avatar
  • Registrado: 25 Feb 2008
  • Mensajes: ?
  • Loc: Ozzuland
  • Status: Online

Nota Febrero 20th, 2007, 11:44 pm

  • maliwik
  • Born
  • Born
  • No Avatar
  • Registrado: Jun 17, 2011
  • Mensajes: 1
  • Status: Offline

Nota Junio 17th, 2011, 11:51 am

knexor2 escribió:
Yo hice algo parecido a esto una vez. Básicamente, tiene una sola tabla con ID automática aumenta, un nombre (por causa de ejemplos) y un pare correspondiente no ID, donde la pare ID no hace referencia a otro elemento de la misma tabla, un pare no de 0 hace referencia a un elemento de nivel superior. ¿En primer lugar, desactivado, es necesario que la jerarquía resultante estar dentro de una estructura de datos, o puede imprimirse directamente a la página?

De todas formas, lo hice tomó todos los elementos y pare ello e impreso en jerarquía de moda en un <select> (extendida para evitar la acción de la lista desplegable). Su una solución recursiva, BTW...

Es el formato de tabla como

+-------------------------+
| ID | Nombre | No pare |

PHP Código: [ Select ]
<?PHP
 
$db_host = "localhost";
$db_un = "username";
$db_pass = "password";
$Item_DB = "Database containing item table";
$table = "Table containing items";
 
$link = mysql_connect($db_host, $db_un, $db_pass);
 
$tab = "        "; // this is 8 spaces, which works as a pseudo-tab character inside the <option>s
$tablvl = 1;
function print_kids($pos) { // $pos is the current position inside the hierarchy (curr item's ID)
   global $link;
   global $tab;
   global $tablvl;
   $pos = ($pos?$pos:null);
   $query = "SELECT * from $table WHERE parent".($pos == null ? " IS NULL" : "=".$pos);
         // NULL parent == top level item.  For 0-parents, replace " IS NULL" with "=0"
   $res = mysql_db_query($Item_DB, $query, $link);
   if (!$res) print(mysql_error());
   while($row = mysql_fetch_array($res)) {
      $has_kids =
      mysql_fetch_array(mysql_db_query($Item_DB, "SELECT * from $table where parent=$row[0]", $link)) != null;
      print("<option value=\"$row[0]\">");
      for ($i=0; $i<$tablvl; $i++) print($tab);
      print("$row[1]</option>\n");
      if ($has_kids) {
         $tablvl++;
         print_kids($row[0]); // recursive call
         $tablvl--;
      }
   }
}
 
$numrows = 1;
$res = mysql_db_query($Item_DB, "SELECT * FROM $table", $link);
while (mysql_fetch_array($res)) $numrows++;
// Yes, I'm sure there's a more efficient way to do this <!-- s:P --><img src=\"{SMILIES_PATH}/icon_razz.gif\" alt=\":P\" title=\"Razz\"><!-- s:P -->
 
print("<select name=\"hierarchy\" size=\"$numrows\">\n");
print("<option value=\"null\" selected=\"selected\">Root of all items</option>\n");
print_kids();
print("</select>");
 
mysql_close($link);
 
?>
 
  1. <?PHP
  2.  
  3. $db_host = "localhost";
  4. $db_un = "username";
  5. $db_pass = "password";
  6. $Item_DB = "Database containing item table";
  7. $table = "Table containing items";
  8.  
  9. $link = mysql_connect($db_host, $db_un, $db_pass);
  10.  
  11. $tab = "        "; // this is 8 spaces, which works as a pseudo-tab character inside the <option>s
  12. $tablvl = 1;
  13. function print_kids($pos) { // $pos is the current position inside the hierarchy (curr item's ID)
  14.    global $link;
  15.    global $tab;
  16.    global $tablvl;
  17.    $pos = ($pos?$pos:null);
  18.    $query = "SELECT * from $table WHERE parent".($pos == null ? " IS NULL" : "=".$pos);
  19.          // NULL parent == top level item.  For 0-parents, replace " IS NULL" with "=0"
  20.    $res = mysql_db_query($Item_DB, $query, $link);
  21.    if (!$res) print(mysql_error());
  22.    while($row = mysql_fetch_array($res)) {
  23.       $has_kids =
  24.       mysql_fetch_array(mysql_db_query($Item_DB, "SELECT * from $table where parent=$row[0]", $link)) != null;
  25.       print("<option value=\"$row[0]\">");
  26.       for ($i=0; $i<$tablvl; $i++) print($tab);
  27.       print("$row[1]</option>\n");
  28.       if ($has_kids) {
  29.          $tablvl++;
  30.          print_kids($row[0]); // recursive call
  31.          $tablvl--;
  32.       }
  33.    }
  34. }
  35.  
  36. $numrows = 1;
  37. $res = mysql_db_query($Item_DB, "SELECT * FROM $table", $link);
  38. while (mysql_fetch_array($res)) $numrows++;
  39. // Yes, I'm sure there's a more efficient way to do this <!-- s:P --><img src=\"{SMILIES_PATH}/icon_razz.gif\" alt=\":P\" title=\"Razz\"><!-- s:P -->
  40.  
  41. print("<select name=\"hierarchy\" size=\"$numrows\">\n");
  42. print("<option value=\"null\" selected=\"selected\">Root of all items</option>\n");
  43. print_kids();
  44. print("</select>");
  45.  
  46. mysql_close($link);
  47.  
  48. ?>
  49.  


(Obviamente?) es una versión ligeramente modificada de lo que tenía, pero lo debe hacer la misma cosa básica. La esperanza de ayuda.:D



AH... Mi... Dios...sólo han puesto fin a semanas de mí trasteo y pisando fuerte. Usted hace algo tan complicado en una función recursiva simple que literalmente ha traído lágrimas a Mis ojos. Algo tan impecable y perfecto (bueno, casi) que se utilizará en cada uno de mis proyectos que requiere capacidad como este. Muchas gracias por esta solución! Esto probablemente será mi único puesto, como estaba tan emocionado por conseguirlo trabajo sólo tuve que registrar aquí gracias!

¿Puede sus programación viajes bug libre y suave que puede ser!

--Mike
  • exceil
  • Born
  • Born
  • No Avatar
  • Registrado: Dic 26, 2011
  • Mensajes: 1
  • Status: Offline

Nota Diciembre 26th, 2011, 4:31 pm

Hola!
Tratar de usar este código de abajo y tengo un problema porque no funciona y yo no sé por qué:(
He cambiado la configuración de conexión en el comienzo, mi db parece escribió knexor2 y nada, tengo sólo "raíz de todos los elementos" en el lugar donde deberían estar categorías.

knexor2 escribió:
Yo hice algo parecido a esto una vez. Básicamente, tienes una sola tabla con auto incrementa ID, un nombre (por el bien de ejemplos) y un correspondiente pare no ID, donde la pare ID no se refiere a otro elemento en la misma mesa, una pare no de 0 hace referencia a un elemento de nivel superior. ¿En primer lugar, desactivado, es necesario que la jerarquía resultante estar dentro de una estructura de datos, o pueden imprimirse directamente a la página?

De todos modos, la cosa que hice tuvo todos los elementos y pare nots e impreso en moda de jerarquía en un &lt;select&gt; (estirada para evitar la acción del menú desplegable). Su una solución recursiva, BTW...

Formato de tabla es igual

+-------------------------+
| ID | Nombre | No pare |

PHP Código: [ Select ]
<?PHP
 
$db_host = "localhost";
$db_un = "username";
$db_pass = "password";
$Item_DB = "Database containing item table";
$table = "Table containing items";
 
$link = mysql_connect($db_host, $db_un, $db_pass);
 
$tab = "        "; // this is 8 spaces, which works as a pseudo-tab character inside the <option>s
$tablvl = 1;
function print_kids($pos) { // $pos is the current position inside the hierarchy (curr item's ID)
   global $link;
   global $tab;
   global $tablvl;
   $pos = ($pos?$pos:null);
   $query = "SELECT * from $table WHERE parent".($pos == null ? " IS NULL" : "=".$pos);
         // NULL parent == top level item.  For 0-parents, replace " IS NULL" with "=0"
   $res = mysql_db_query($Item_DB, $query, $link);
   if (!$res) print(mysql_error());
   while($row = mysql_fetch_array($res)) {
      $has_kids =
      mysql_fetch_array(mysql_db_query($Item_DB, "SELECT * from $table where parent=$row[0]", $link)) != null;
      print("<option value=\"$row[0]\">");
      for ($i=0; $i<$tablvl; $i++) print($tab);
      print("$row[1]</option>\n");
      if ($has_kids) {
         $tablvl++;
         print_kids($row[0]); // recursive call
         $tablvl--;
      }
   }
}
 
$numrows = 1;
$res = mysql_db_query($Item_DB, "SELECT * FROM $table", $link);
while (mysql_fetch_array($res)) $numrows++;
// Yes, I'm sure there's a more efficient way to do this <!-- s:P --><img src=\"{SMILIES_PATH}/icon_razz.gif\" alt=\":P\" title=\"Razz\"><!-- s:P -->
 
print("<select name=\"hierarchy\" size=\"$numrows\">\n");
print("<option value=\"null\" selected=\"selected\">Root of all items</option>\n");
print_kids();
print("</select>");
 
mysql_close($link);
 
?>
 
  1. <?PHP
  2.  
  3. $db_host = "localhost";
  4. $db_un = "username";
  5. $db_pass = "password";
  6. $Item_DB = "Database containing item table";
  7. $table = "Table containing items";
  8.  
  9. $link = mysql_connect($db_host, $db_un, $db_pass);
  10.  
  11. $tab = "        "; // this is 8 spaces, which works as a pseudo-tab character inside the <option>s
  12. $tablvl = 1;
  13. function print_kids($pos) { // $pos is the current position inside the hierarchy (curr item's ID)
  14.    global $link;
  15.    global $tab;
  16.    global $tablvl;
  17.    $pos = ($pos?$pos:null);
  18.    $query = "SELECT * from $table WHERE parent".($pos == null ? " IS NULL" : "=".$pos);
  19.          // NULL parent == top level item.  For 0-parents, replace " IS NULL" with "=0"
  20.    $res = mysql_db_query($Item_DB, $query, $link);
  21.    if (!$res) print(mysql_error());
  22.    while($row = mysql_fetch_array($res)) {
  23.       $has_kids =
  24.       mysql_fetch_array(mysql_db_query($Item_DB, "SELECT * from $table where parent=$row[0]", $link)) != null;
  25.       print("<option value=\"$row[0]\">");
  26.       for ($i=0; $i<$tablvl; $i++) print($tab);
  27.       print("$row[1]</option>\n");
  28.       if ($has_kids) {
  29.          $tablvl++;
  30.          print_kids($row[0]); // recursive call
  31.          $tablvl--;
  32.       }
  33.    }
  34. }
  35.  
  36. $numrows = 1;
  37. $res = mysql_db_query($Item_DB, "SELECT * FROM $table", $link);
  38. while (mysql_fetch_array($res)) $numrows++;
  39. // Yes, I'm sure there's a more efficient way to do this <!-- s:P --><img src=\"{SMILIES_PATH}/icon_razz.gif\" alt=\":P\" title=\"Razz\"><!-- s:P -->
  40.  
  41. print("<select name=\"hierarchy\" size=\"$numrows\">\n");
  42. print("<option value=\"null\" selected=\"selected\">Root of all items</option>\n");
  43. print_kids();
  44. print("</select>");
  45.  
  46. mysql_close($link);
  47.  
  48. ?>
  49.  


(Obviamente?) es una versión ligeramente modificada de lo que tenía, pero debe hacer la misma cosa básica. Espero que ayude.:D

Publicar Información

  • Total de mensajes en este tema: 18 mensajes
  • Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 97 invitados
  • No puede abrir nuevos temas en este Foro
  • No puede responder a temas en este Foro
  • No puede editar sus mensajes en este Foro
  • No puede borrar sus mensajes en este Foro
  • No puede enviar adjuntos en este Foro
 
 

© 2011 Unmelted, LLC. Ozzu® es una marca registrada de Unmelted, LLC