處理無限級分類獲取頂層父 ID 是經典問題。傳統遞迴查詢存在效能隱憂與程式碼冗餘,本文分享一行核心程式碼解決的優雅技巧。
資料表結構:id(分類 ID)、name(名稱)、pid(父分類 ID)
需求:給定任一分類 ID(如 13),追溯至頂層父分類(pid=0 或 null)
pid 映射陣列
$sql = "SELECT id, pid FROM category_table";
$arr = []; // 格式:[id => pid]
foreach ($pdo->query($sql) as $row) {
$arr[$row['id']] = $row['pid'];
}
// 建議將 $arr 快取至 Redis/Memcached,避免重複查詢
// 2. 核心邏輯:僅 3 行程式碼
$id = 13; // 目標分類 ID
while ($arr[$id]) { // 當父 ID 存在時持續向上追溯
$id = $arr[$id]; // 移動到父層
}
echo $id; // 輸出頂層分類 ID(如 1)
假設資料:13→5, 5→1, 1→0
$id=13,$arr[13]=5 存在 → $id=5$id=5,$arr[5]=1 存在 → $id=1$id=1,$arr[1]=0 為假值 → 迴圈結束1(頂層分類)| 維度 | 遞迴查詢 | 陣列迭代 |
|---|---|---|
| 查詢次數 | N 次(N=深度) | 1 次 |
| 程式碼行數 | 20+ 行 | 3 行核心 |
| 記憶體佔用 | 呼叫堆疊 | 單一陣列 |
| 爆棧風險 | 深度>1000 有風險 | 無 |
| 快取友好度 | 需快取樹結構 | 扁平陣列極易快取 |
$path[] = $id 即可收集所有祖先 ID這個「以空間換時間、用迭代替遞迴」的思維,不僅解決分類問題,更是處理樹狀結構的通用智慧。