Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk Membina Menu Tahap Tanpa Had dengan PHP dan MySQL: Penyelesaian Rekursif?

Bagaimana untuk Membina Menu Tahap Tanpa Had dengan PHP dan MySQL: Penyelesaian Rekursif?

Susan Sarandon
Susan Sarandonasal
2024-11-01 13:12:30650semak imbas

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

Membina Menu Tahap Tanpa Had dengan PHP dan MySQL

Untuk membina menu kompleks dengan pelbagai peringkat dan submenu, pendekatan biasa melibatkan penggunaan pangkalan data struktur untuk menyusun item menu. Dalam struktur sedemikian, menu peringkat atas biasanya mempunyai ID induk 0, manakala submenu diberikan ID menu induknya.

Satu cabaran timbul apabila anda perlu menyemak submenu secara rekursif dan memaparkannya dalam masing-masing. senaraikan item. Begini cara untuk melakukannya menggunakan PHP dan MySQL:

Pertanyaan MySQL:

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

Pertanyaan ini mengambil semua item menu dalam susunan hierarki berdasarkan ibu bapa-anak mereka perhubungan.

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

Penjelasan:

  1. Kod PHP mencipta tindanan kepada jejaki ID menu induk ($parent_stack).
  2. Ia berpusing melalui item menu berdasarkan perhubungan ibu bapa-anak mereka.
  3. Jika item menu mempunyai anak, ia akan ditambahkan pada penghujung daripada rentetan output HTML dengan
      untuk submenunya.
    • ID induk semasa ditolak ke tindanan dan induk semasa ditetapkan kepada ID item menu semasa.
    • Jika item menu tidak mempunyai anak, ia hanya ditambahkan pada rentetan output HTML sebagai
    • .
    • Jika tiada lagi kanak-kanak pada tahap induk semasa atau jika tindanan tidak kosong, induk semasa akan muncul daripada tindanan dan arus induk ditetapkan kepada ID yang muncul.
    • Gelung diteruskan sehingga semua item menu telah diproses.

Pendekatan ini menyediakan cara yang fleksibel dan cekap untuk membina menu dengan tahap submenu yang tidak terhad tanpa risiko gelung tak terhingga yang boleh berlaku dengan rekursi.

Atas ialah kandungan terperinci Bagaimana untuk Membina Menu Tahap Tanpa Had dengan PHP dan MySQL: Penyelesaian Rekursif?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn