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

PHP 無限級分類獲取頂級分類 ID:陣列迭代優雅解法

     編輯:PHP 綜合知識

拒絕遞迴爆棧:用陣列查找替代遞迴查詢的極簡方案

處理無限級分類獲取頂層父 ID 是經典問題。傳統遞迴查詢存在效能隱憂與程式碼冗餘,本文分享一行核心程式碼解決的優雅技巧。

問題場景

資料表結構:id(分類 ID)、name(名稱)、pid(父分類 ID)
需求:給定任一分類 ID(如 13),追溯至頂層父分類(pid=0 或 null)

演進歷程對比

  1. 遞迴查 DB:每層一個查詢,N+1 問題嚴重,後加快取緩解
  2. 全表快取 + 遞迴:減少查詢,但遞迴邏輯仍複雜,深度過大仍有爆棧風險
  3. 陣列迭代(本文方案):一次查詢、零遞迴、O(深度) 時間複雜度、極簡程式碼

核心實作

 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

  1. $id=13,$arr[13]=5 存在 → $id=5
  2. $id=5,$arr[5]=1 存在 → $id=1
  3. $id=1,$arr[1]=0 為假值 → 迴圈結束
  4. 輸出 1(頂層分類)

優勢總結

維度遞迴查詢陣列迭代
查詢次數N 次(N=深度)1 次
程式碼行數20+ 行3 行核心
記憶體佔用呼叫堆疊單一陣列
爆棧風險深度>1000 有風險無
快取友好度需快取樹結構扁平陣列極易快取

擴展應用

  • 獲取完整路徑:迴圈中 $path[] = $id 即可收集所有祖先 ID
  • 批量查詢:對多個 ID 並行執行,共用同一映射陣列
  • 樹狀重建:同樣映射陣列可 O(N) 重建完整樹結構

這個「以空間換時間、用迭代替遞迴」的思維,不僅解決分類問題,更是處理樹狀結構的通用智慧。

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