Domanda

Quindi il menu finale sarà simile a questo:

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

Basato sui seguenti record DB:

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

Come potrei fare per visualizzare? La mia ipotesi è che comporterà la memorizzazione di tutti gli elementi in un array multidimensionale, quindi il ciclo in qualche modo ...

È stato utile?

Soluzione

Gestire la struttura dei dati così come è spesso implica la ricorsione o più query per costruire l'albero.

Hai considerato altri modi per archiviare una gerarchia? Scopri il traversal pre-ordine modificato: ecco un articolo basato su PHP su questo .

Altri suggerimenti

I dati gerarchici sono in qualche modo fastidiosi in un database relazionale (escluso Oracle, che ha operatori in START WITH/CONNECT BY per occuparsene). Esistono sostanzialmente due modelli : elenco di adiacenza e set nidificati.

Hai scelto i set di adiacenza, che è quello che faccio anch'io di solito. È molto più facile cambiare rispetto al modello di set nidificato, sebbene il modello di set nidificato possa essere recuperato nell'ordine corretto in una singola query. Le liste di adiacenza non possono essere. Dovrai creare una struttura di dati intermedia (albero) e poi convertirla in un elenco.

Quello che farei (e di fatto ho fatto di recente) è:

  • seleziona l'intero contenuto del menu in una query ordinata per ID genitore;
  • Crea un albero della struttura del menu usando array associativi o classi / oggetti;
  • Cammina su quell'albero per creare elenchi non ordinati nidificati; e
  • Utilizza un plug-in jQuery come Superfish per trasformare questo elenco in un menu.

Costruisci qualcosa del genere:

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

e convertilo in questo:

<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>
...

Il PHP per la generazione dell'array di menu è ragionevolmente semplice ma un po 'complicato da risolvere. Si utilizza una funzione ricorsiva di camminata sugli alberi che crea il markup dell'elenco nidificato HTML ma ne lascerà l'implementazione come esercizio per il lettore. :)

Il modo in cui archiviare i dati gerarchici non è efficiente come si potrebbe desiderare. Ho letto l'articolo Gestione dei dati gerarchici in MySQL alcuni anni fa e da allora l'ho trovata come la migliore soluzione per la gestione dei dati basati su gerarchia in SQL. Il prossimo miglior vantaggio è che credo che tu possa prendere l'intero albero con una query.

Ho appena pubblicato in una domanda simile il mio approccio per trasformare i dati gerarchici di MySQL (elenco di adiacenza) in un menu (HTML)

non utilizza la ricorsione. E richiede una singola query al database.

Leggi di più su

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

Grazie.

Un altro modo semplice per generare una gerarchia se non si desidera utilizzare set nidificati consiste nell'utilizzare una semplice stringa di testo in primo piano.

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

Diventerebbe

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

La cifra davanti a ciascun oggetto può essere memorizzata in un campo e analizzata in base alla lunghezza (che rappresenta la profondità di dove si trova) per dirti tutto ciò che devi sapere su dove va.

Uso gerarchie di set nidificati per cose più complicate che richiedono calcoli, ecc., ma trovo che questo approccio sia servito bene

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top