2011-11-22 114 views
3

我正在尋找最佳的方式來即時創建複雜的導航元素。我擁有數據庫中的所有元素(標題,ID,parentId),並且我想有效地將​​它們從數據庫中取出並正確顯示。我也想摺疊所有不活動的導航元素。因此,如果我瀏覽「沙發」,我不會看到「枝形吊燈」或照明下的任何類別,但我會看到「照明」。動態創建動態導航

這就是我想要的最終產品看起來像:

  • 傢俱
    • 客廳
      • 沙發
      • 椅子
      • 腳墊
    • 臥室
      • 牀頭
  • 照明
    • 吊燈
    • 落地燈
    • 壁燈
  • 地毯&種紡織品
    • 當代
    • 復古

我現在的方法是

  1. 寫一個SQL查詢,拉低所有的類別名稱,ID和父ID的
  2. 遍歷這些類別並將其放入一個已排序的多維數組中,並在子元素下存儲子類別TS。
  3. 迭代通過新的數組和添加其他的記錄標記適當的類別爲開放(所有類別都默認是關閉的),通過陣列
  4. 迭代和寫入HTML

我想這個儘可能少的交易,我相信我現在的代碼是低效的。特別是第2步,我遍歷數組數次。這個(普通的?)問題必須有一個通用的解決方案。

+0

你爲什麼不標註相應的類別第二迭代期間開放,同時創造一個多維數組? – haynar

+0

您是否使用JavaScript或其他客戶端邏輯?如果沒有,那麼你看不到的東西就無法打開,並且沒有理由得到/處理那些信息...... – jswolf19

回答

2

考慮在數據庫表中添加一個新字段:level
主要類別將具有 子類別將具有level 1.
子子類將有level 2.

這一招將幫助你知道停用沒有數組的第2個迭代其子類別。

0

我相信這是使用遞歸來生成HTML代碼的理想場所。 前段時間我使用了這個函數。它正在與一個多維數組(樹)

function buildMenu($menu_array, $is_sub=FALSE) { 
     $attr = (!$is_sub) ? 'id="menu"' : 'class="submenu"'; 
     $menu = "<ul $attr>\n"; 
     foreach($menu_array as $id => $elements) { 
      foreach($elements as $key => $val) { 
       if(is_array($val)) { 
        $sub = buildMenu($val, TRUE); 
       } 
       else { 
        $sub = NULL; 
        $$key = $val; 
       } 
      } 
      if(!isset($url)) { 
       $url = $id; 
      } 
      $menu .= "<li><a href=\"$url\">$display</a>$sub</li>\n"; 
      unset($url, $display, $sub); 
     } 
     return $menu . "</ul>\n"; 
    } 
    echo buildMenu($menu_array); 

這也增加了css屬性。如果你想標記當前活動頁面,你可以使用strpos()功能找到你當前的網址。如果你需要更多的功能,您可以輕鬆地將它們添加到buildMenu()

使用水平在回答上面提到將有助於太。如果您在數據庫中使用嵌套集合模型,我也可以幫助您查詢我的查詢,這是一個選擇返回整個菜單數據的單一選擇。