使用PHP 和MySQL 查詢父級下的所有子節點、孫節點等節點
原始問題:
檢索與父節點關聯的所有子節點、孫節點和後續後代節點是使用分層資料結構時的常見任務。這個問題出現在資料庫表採用鄰接表模型進行資料組織的場景。
使用遞迴的方法:
為了解決這個問題,遞迴被證明是一種有效的方法。以下是如何使用遞歸來實現此目標的詳細說明:
1。建立基本函數:
遞歸函數是一種呼叫自身來解決問題的函數,通常用於涉及分層或嵌套資料結構的場景。在本例中,我們的基底函數將命名為 fetch_recursive.
2。確定遞歸呼叫的條件:
在fetch_recursive 中,兩個主要條件決定何時進行遞歸呼叫:
3.建構結果數組:
每次進行遞歸呼叫時,函數都會使用目前節點的相關資料填入結果陣列。隨著遞歸呼叫遍歷樹結構,此數組將迭代增長。
4。遞歸搜尋子節點:
如果目前節點有任何子節點(透過children屬性的存在來識別),將進行另一個遞歸呼叫來檢索這些子節點。此過程持續進行,直到捕獲父節點的所有子節點。
附加功能:
1。處理孫子和後代:
fetch_recursive 的遞歸性質確保它會自動遍歷層次結構,不僅檢索子節點,還檢索孫子和後續後代。
2 。統一結果:
所有遞歸呼叫完成後,函數傳回一個完整的數組,其中包含指定父節點下的所有後代節點。
程式碼實作:
function fetch_recursive($src_arr, $currentid, $parentfound = false, $cats = array()) { foreach($src_arr as $row) { if((!$parentfound && $row['id'] == $currentid) || $row['parent_id'] == $currentid) { $rowdata = array(); foreach($row as $k => $v) $rowdata[$k] = $v; $cats[] = $rowdata; if($row['parent_id'] == $currentid) $cats = array_merge($cats, fetch_recursive($src_arr, $row['id'], true)); } } return $cats; }
用法:
要使用fetch_recursive 函數,只需傳遞原始資料數組(在本例中為$data)和您從中取得節點的ID欲尋回子孫。例如,要檢索節點3 下的所有子節點、孫節點和後代節點:
$list = fetch_recursive($data, 3);
這將使用陣列填入$list 變數包含所有相關節點。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3