PHP / MySQL ile hiyerarşik yineleme menüsü

3 Cevap php

Bu (umarım) size bazılarını yanıtlamak için oldukça kolay bir soru olmalıdır.

Ben bir mySQL veritabanından bir çalışma Recursive menü var, şimdi benim asıl sorun:

URL oluşturmak için en iyi yolu nedir? Her satır gibi / yumurta / süt / pastırma / başlığında getirmeyi tercih ederim. Yumurta gibi seviye 0 olarak: yumurta-0, süt-1, pastırma-2. Herhangi çıktı bu dynamicly nasıl fikir?

I am pretty much going for what "cletus" said a few comments down on this question: http://stackoverflow.com/questions/477793/php-mysql-building-a-nav-menu-hierarchy

Ama bunu yapmak için nasıl biraz daha açıklama gerekiyor.

3 Cevap

Sık sık menü ağacı değiştirmek düşünmüyorsanız, her menü öğesi için gerekli hiyerarşik URL'yi öncesi depolama muhtemelen (run-time çözünürlük için) kolay değildir.

Eğer ağaç yeterince sık değiştirilmesi düşünüyorsanız, diyelim - bir web arayüzü üzerinden, o yolları size menüyü okumak her zaman, böyle bir şey oluşturmak için daha kolay olacaktır:

 id | name   | parent
----+--------+-------
 0  | eggs   | NULL
 1  | milk   | 0
 2  | bacon  | 1
 3  | tomato | 0
 4  | lettuce| 1

foreach (query("SELECT * FROM menu ORDER BY parent ASC") as $row) {
  $menuitem = array_merge(array(), $row);
  $menuLookup[$menuitem['id']] &= $menuitem;
  if ($menuitem['parent'] == null) {
    $menuitem['path'] = "/" . $menuitem['name'];
    $menu[] &= $menuitem[];
  } else {
    $parent &= $menuLookup[$menuitem['parent']];
    $menuitem['path'] = $parent['path'] . "/" . $menuitem['name'];
    $parent['menu'][] &= $menuitem;
  }
}

Ben sadece doğruluğu için test, bu kodu ayıklanan değil ;-)

Eh, bir hiyerarşi isterseniz, ben ayrıntılı olarak anlatılmıştır "Modifiye Preorder Ağacı Geçişi" denir bilmek iyi yöntem in this Sitepoint article, yaklaşık yarım başlar.

Guss önerdi ne temel farkı biraz daha ölçülebilir olmasıdır ve sadece aradığınız ağacın bir kısmını almak için çok daha kolay.