Pregunta

Entonces el menú final se verá así:

Item B
    Item B-1
        Item B-1-2
        Item B-1-1
Item A
    SubItem A-1
    SubItem A-2
Item C

Basado en los siguientes registros de base de datos:

id        menu_title          parent_menu_id    menu_level    weight
1         Item A                0                           1                     1
2         Item B                0                           1                     0
3         Item C                0                           1                     2
4         SubItem A-2       1                           2                     1
5         Item B-1             2                           2                     0
6         Item B-1-1          5                           3                     1
7         SubItem A-1       1                           2                     0
8         Item B-1-2          5                           3                     0

¿Cómo haría para mostrarlo? Supongo que implicará almacenar todos los elementos en una matriz multidimensional y luego recorrerlos de alguna manera...

¿Fue útil?

Solución

Tratar la estructura de datos tal como la tiene a menudo implicará recurrencia o múltiples consultas para construir el árbol.

¿Ha considerado otras formas de almacenar una jerarquía? Eche un vistazo a la modificación del pedido anticipado: aquí hay un buen artículo basado en PHP sobre este .

Otros consejos

Los datos jerárquicos son algo molestos en una base de datos relacional (excluyendo Oracle, que tiene operadores en START WITH/CONNECT BY para lidiar con esto). Básicamente, hay dos modelos : lista de adyacencia y conjuntos anidados.

Has elegido conjuntos de adyacencia, que es lo que normalmente hago también. Es mucho más fácil cambiar que el modelo de conjunto anidado, aunque el modelo de conjunto anidado se puede recuperar en el orden correcto en una sola consulta. Las listas de adyacencia no pueden ser. Tendrá que construir una estructura de datos intermedia (árbol) y luego convertirla en una lista.

Lo que haría (y de hecho lo he hecho recientemente) es:

  • seleccione todo el contenido del menú en una consulta ordenada por ID principal;
  • Construya un árbol de la estructura del menú usando matrices asociativas o clases / objetos;
  • Recorre ese árbol para crear listas anidadas sin ordenar; y
  • Use un complemento jQuery como Superfish para convertir esa lista en un menú.

Construyes algo como esto:

$menu = array(
  array(
    'name' => 'Home',
    'url' => '/home',
  ),
  array(
    'name' => 'Account',
    'url' => '/account',
    'children' => array(
      'name' => 'Profile',
      'url' => '/account/profile',
    ),
  ),
  // etc
);

y conviértalo en esto:

<ul class="menu">;
  <li><a href="/">Home</a></li>
  <li><a href="/account">Account Services</a>
    <ul>
      <li><a href="/account/profile">Profile</a></li>
...

El PHP para generar la matriz de menú es razonablemente sencillo pero un poco difícil de resolver. Utiliza una función recursiva de caminar por el árbol que construye el marcado de lista anidada HTML pero dejará su implementación como un ejercicio para el lector. :)

La forma en que almacena datos jerárquicos no es tan eficiente como desearía.leí el artículo Gestión de datos jerárquicos en MySQL hace unos años y desde entonces lo he encontrado como el La mejor solución para gestionar datos basados ​​en jerarquías en SQL.El siguiente mejor beneficio es que creo que puedes obtener todo el árbol con una sola consulta.

Acabo de publicar en una pregunta similar mi propio enfoque para transformar los datos jerárquicos de MySQL (lista de adyacencia) en un menú (HTML)

no usa la recursividad. Y requiere una consulta única a la base de datos.

Lea más en

https://stackoverflow.com/questions/2871861#3368622

Gracias.

Otra forma sencilla de generar jerarquía si no desea utilizar conjuntos anidados es utilizar una cadena de texto simple al frente.

Item B
    Item B-1
        Item B-1-2
        Item B-1-1
Item A
    SubItem A-1
    SubItem A-2
Item C

Sería

1 Item B
  1.1 Item B1
    1.1.1 Item B11
    1.1.2 Item B12
2 Item A
  2.1 Item A1
  2.2 Item B2
3 Item C

El dígito frente a cada elemento podría almacenarse en un campo y analizarse en función de la longitud (que representa la profundidad de donde está) para decirle todo lo que necesita saber sobre dónde va.

Utilizo jerarquías de conjuntos anidados para cosas más complicadas que requieren cálculo, etc., pero creo que este enfoque ha servido bien

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top