首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 無限級分類菜單實作:利用 Path 路徑字段實現高效樹狀結構

     編輯:PHP 相關知識

核心思路:Path 路徑法

傳統遞歸查詢在層級較深時效能低下。採用 path 字段存儲從根節點到當前節點的 ID 路徑(如 ,1,3,6,),即可通過單條 SQL 按路徑排序輸出,配合前綴縮進實現無限級分類顯示,完全避免遞歸。

資料表設計

字段類型說明
idINT PK主鍵 ID
fidINT父分類 ID,頂級為 0
nameVARCHAR分類名稱
pathVARCHAR路徑字串,格式:,父ID,當前ID,

示例數據

id | fid | name       | path
---|-----|------------|------------
1  | 0   | 分類1      | ,1,
2  | 0   | 分類2      | ,2,
3  | 1   | 分類1-1    | ,1,3,
4  | 1   | 分類1-2    | ,1,4,
5  | 2   | 分類2-1    | ,2,5,
6  | 4   | 分類1-2-1  | ,1,4,6,

PHP 類別實現

<?php
class CategoryMenu {
    private $conn;

    public function __construct() {
        $this->conn = new mysqli("localhost", "root", "password", "dbname");
        $this->conn->set_charset("utf8mb4");
    }

    public function getTree() {
        $sql = "SELECT id, name, path FROM category ORDER BY path";
        $result = $this->conn->query($sql);
        $html = '';
        while ($row = $result->fetch_assoc()) {
            // 計算層級:path 中逗號數量 - 2 (因為首尾各有一個逗號)
            $level = substr_count($row['path'], ',') - 2;
            $indent = str_repeat('    ', max(0, $level));
            $html .= "{$indent}{$row['name']}<br>";
        }
        return $html;
    }

    public function __destruct() {
        $this->conn->close();
    }
}

// 使用
$menu = new CategoryMenu();
echo $menu->getTree();

優勢與應用場景

  • 查詢效率高: 單次 SQL 獲取所有節點,無遞歸開銷。
  • 移動子樹容易: 更新 path 字段前綴即可批量移動整個分支。
  • 適用範圍廣: 商品分類、地區劃分、組織架構、文章標簽等所有樹狀結構。

後台維護提示

新增節點時,path = 父節點path + 新ID + ',';刪除需遞歸清理子節點;修改父級需更新該節點及所有後代的 path。建議封裝為 Model 方法統一維護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved