首頁  >  文章  >  資料庫  >  如何使用 PHP 和 MySQL 建立無限級選單:遞歸解決方案?

如何使用 PHP 和 MySQL 建立無限級選單:遞歸解決方案?

Susan Sarandon
Susan Sarandon原創
2024-11-01 13:12:30571瀏覽

How to Build Unlimited-Level Menus with PHP and MySQL: A Recursive Solution?

使用PHP 和MySQL 建立無限級選單

要建立具有多個層級和子選單的複雜選單,常見的方法是利用資料庫組織菜單項目的結構。在這種結構中,頂級選單的父級 ID 通常為 0,而子選單則指派其父級選單的 ID。

當您需要遞歸檢查子選單並在各自的子選單中顯示它們時,就會出現一個挑戰列出項目。以下是使用PHP 和MySQL 完成此操作的方法:

MySQL 查詢:

SELECT id, parent_id, name, link, position
FROM menu_item
ORDER BY parent_id, position;

此查詢根據父子關係按分層順序取得所有選單項目

PHP 實作:

<code class="php">$html = '';
$parent = 0; // Starting with the top-level menu
$parent_stack = array(); // Keeps track of parent menu IDs

// Map menu items by their parent ID
$children = array();
foreach ($items as $item) {
    $children[$item['parent_id']][] = $item;
}

while (
    // If there are more children at the current parent level
    ($option = each($children[$parent])) ||
    // Or if we need to backtrack to a previous parent level
    ($parent > 0)
) {
    if (!empty($option)) {
        // Handle menu items with children
        if (!empty($children[$option['value']['id']])) {
            $html .= '<li>' . $option['value']['name'] . '</li>';
            $html .= '<ul class="submenu">';
            array_push($parent_stack, $parent); // Push current parent ID to the stack
            $parent = $option['value']['id']; // Set current parent to the current menu item's ID
        }
        // Handle menu items without children
        else {
            $html .= '<li>' . $option['value']['name'] . '</li>';
        }
    } else {
        // Backtrack to the previous menu level
        $html .= '</ul>';
        $parent = array_pop($parent_stack); // Pop the last parent ID from the stack
    }
}

// Output the resulting HTML
echo $html;</code>

說明:

  1. PHP 選單碼建立一個堆疊父ID (ID $parent_stack)。
  2. 它根據父子關係循環遍歷選單項目。
  3. 如果選單項目有子項,則會將其新增至末尾帶有巢狀
      的 HTML 輸出字串其子選單。
  4. 目前父級 ID 被壓入堆疊,並將目前父級設定為目前選單項目的 ID。
  5. 如果選單項目沒有子級,則它只是作為
  6. 新增到 HTML 輸出字串中。
  7. 如果當前父級不再有子級或堆疊不為空,則從堆疊中彈出當前父級,並且當前parent 設定為彈出的 ID。
  8. 循環繼續,直到處理完所有選單項目。

這種方法提供了一種靈活高效的方法來建立具有無限等級子選單的選單沒有遞歸可能發生的無限循環的風險。

以上是如何使用 PHP 和 MySQL 建立無限級選單:遞歸解決方案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn