簡體   English   中英

PHP / MySQL - 構建導航菜單層次結構

[英]PHP/MySQL - building a nav menu hierarchy

所以最終菜單看起來像這樣:

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

基於以下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

我該怎么去展示? 我的猜測是它將涉及將所有項目存儲到一個多維數組中,然后以某種方式循環遍歷它...

在關系數據庫中,分層數據有點煩人(不包括Oracle,它在START WITH/CONNECT BY有運算符來處理這個問題)。 基本上有兩種模型 :鄰接列表和嵌套集。

你選擇了鄰接集,這也是我通常也會做的。 盡管可以在單個查詢中以正確的順序檢索嵌套集模型,但它比嵌套集模型更容易更改。 鄰接列表不能。 您需要構建一個中間數據結構(樹),然后將其轉換為列表。

我會做什么(事實上最近做過)是:

  • 在按父ID排序的一個查詢中選擇整個菜單內容;
  • 使用關聯數組或類/對象構建菜單結構的樹;
  • 走這棵樹來創建嵌套的無序列表;
  • 使用像Superfish這樣的jQuery插件將該列表轉換為菜單。

你建立這樣的東西:

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

並將其轉換為:

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

用於生成菜單數組的PHP相當簡單,但有點難以解決。 您使用遞歸樹行走函數來構建HTML嵌套列表標記,但將其實現作為讀者的練習。 :)

處理數據結構時,通常會涉及遞歸或多個查詢來構建樹。

您是否考慮過存儲層次結構的其他方法? 查看修改后的預訂遍歷 - 這是一篇很好的基於PHP的文章

存儲分層數據的方式不如您所希望的那樣高效。 幾年前我讀過MySQL中管理分層數據的文章並且發現它是在SQL中管理基於層次結構的數據最佳解決方案。 下一個最大的好處是我相信你可以通過一個查詢獲取整個樹。

我剛剛發布了一個類似的問題我自己的方法將MySQL分層數據(鄰接列表)轉換為菜單(HTML)

使用遞歸。 它需要對數據庫進行單一查詢

了解更多信息

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

謝謝。

如果您不想使用嵌套集,則可以生成層次結構的另一種簡單方法是在前面使用簡單的文本字符串。

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

會成為

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

每個項目前面的數字可以存儲在一個字段中,並根據長度(代表它的深度)進行解析,以告訴您需要了解的所有內容。

我使用嵌套集層次結構來處理需要計算的更復雜的東西,但是我覺得這種方法很好用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM