無限級分類是電商、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;
<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) 減少查詢