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

PHP 遞歸實現無限級分類:資料庫設計與樹狀下拉選單生成代碼

     編輯:PHP 相關知識

無限級分類是電商、CMS 常見需求。本文採用「遞歸查詢 + 遞歸輸出」模式,資料表僅需 id、name、parentId 三欄,代碼簡潔易懂。

資料表結構

CREATE TABLE `city` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
    `parentId` int(11) NOT NULL DEFAULT '0',
    PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

PHP 遞歸生成 <select> 選項

<?php
$db = new DB($host, $user, $pass, $port, $dbname, $charset);

function findCity($table, $parentId = 0, $level = 1) {
    global $db;
    $sql = "SELECT id, name, parentId FROM $table WHERE parentId = $parentId ORDER BY id";
    $rows = $db->getArray($sql);
    if (!$rows) return;

    $prefix = '|' . str_repeat('--', $level - 1);
    foreach ($rows as $row) {
        echo "<option value='{$row['id']}'>{$prefix}{$row['name']}</option>";
        findCity($table, $row['id'], $level + 1);
    }
}

findCity('city');
?>

優缺點分析

優點缺點
代碼極簡,邏輯直觀深層分類遞歸深度大,可能超出記憶體/棧限制
無需修改表結構每層皆查詢資料庫,N+1 問題明顯,大數據量效能差

生產優化方向

  • 改用「路徑枚舉法」(path: 1/3/5/) 或「嵌套集合模型」(lft/rgt) 減少查詢
  • 一次性讀取全表,PHP 記憶體中建樹輸出(適合中小數據量)
  • 緩存生成的 HTML 片段
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved