PHP / MySQL - nav menü hiyerarşisi bina

5 Cevap php

Yani son menü bu gibi bir şey olacaktır:

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

Aşağıdaki DB kayıtlarına dayanarak:

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

How would I go about displaying? Benim tahminim sonra bir şekilde bu döngü, çok boyutlu bir diziye bütün öğeleri saklamak dahil edeceksiniz ...

5 Cevap

Eğer sık ​​sık ağaç oluşturmak için özyineleme veya birden fazla sorgu içerecektir gibi veri yapısı ile ilgili.

Bir hiyerarşi depolama başka yollar düşündünüz mü? Modifiye ön sipariş kastetmek Çıkış - burada güzel PHP based article about this.

Hiyerarşik veri (bu ile başa çıkmak için START WITH/CONNECT BY operatörleri vardır Oracle hariç) bir relationsal veritabanında biraz can sıkıcı. Temelde vardır two models: bitişiklik listesi ve iç içe setleri.

Ben genellikle çok ne olduğu, komşuluk setleri seçtiniz. İç içe kümesi modeli tek bir sorguda doğru sırayla alınabilir rağmen, iç içe kümesi modelinde daha değiştirmek çok kolay. Adjacency listeleri olamaz. Sen bir ara veri yapısını (ağacı) inşa etmek ve daha sonra bir liste haline dönüştürmek olduğunu gerekir.

Ne yapardın (ve aslında son zamanlarda yapmış) olan:

  • üst kimliği tarafından sipariş bir sorgudaki tüm menü içeriğini seçmek;
  • Ilişkilendirilebilir diziler ya da sınıfları / nesneleri kullanarak menü yapısı bir ağaç oluşturmak;
  • İç içe sırasız listeler oluşturmak için o ağacı yürüyün; ve
  • Kullanın jQuery plug-in Superfish bir menü içine listesini açmak gibi.

Böyle bir şey inşa:

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

ve bu haline dönüştürmek:

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

Gelen menü dizi oluşturmak için PHP çözmek için makul basit ama biraz finnicky olduğunu. Sen HTML yuvalanmış liste biçimlendirmesi kuran bir özyinelemeli ağaç yürüme fonksiyonunu kullanın ama okuyucu için bir alıştırma olarak gerçekleştirimdir bırakacaktır. :)

Senin hiyerarşik veri depolama yolu isteyebilirsiniz kadar verimli değildir. Ben makaleyi Managing Hierarchical Data in MySQL birkaç yıl önce okumak ve SQL hiyerarşi tabanlı verileri yönetmek için the en iyi çözüm olarak bulundu beri var. Sonraki en iyi yararı sana bir sorgu ile tüm ağaç kapmak inanmamız.

Ben sadece bir menü (HTML) içine MySQL hiyerarşik verileri (bitişiklik listesi) dönüştürmek için benzer bir soru benim kendi yaklaşımını yayınlanmıştır

Bu not özyineleme kullanma yoktur. Ve bu veritabanına bir single query gerektirir.

Daha fazla oku

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

Teşekkürler.

Eğer iç içe setleri kullanmak istemiyorsanız eğer hiyerarşi oluşturabilir diğer basit yolu önünde basit bir metin dizesi kullanmaktır.

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

Olacak

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

Her öğenin önündeki basamaklı bir alanda depolanan ve size nereye gittiğini hakkında bilmeniz gereken her şeyi anlatmak için (nerede derinliğini temsil eden) uzunluğuna göre ayrıştırıldı olabilir.

Ben hesaplama, e tc gerektiren daha karmaşık şeyler için iç içe set hiyerarşileri kullanın, ama bu yaklaşım iyi hizmet etti bulmak