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

PHP 遞迴輸出階層式資料 (父子層級關係) 通用函數

     編輯:PHP 相關知識

資料庫儲存無限分類 (如留言板回覆、商品分類、選單) 時,需將扁平資料轉為樹狀結構並按層級輸出。本文提供 getSubComments($parent, $level) 遞迴函數,查詢子記錄、標記層級、合併陣列,再於輸出端依 level 產生縮排前綴 (如 ----|-)。

核心遞迴函數

function getSubComments($parent = 0, $level = 0) {
    $db = &JFactory::getDBO(); // Joomla DBO,依框架調整
    $sql = "SELECT * FROM comments WHERE parent = $parent ORDER BY ordering";
    $db->setQuery($sql);
    $rows = $db->loadObjectList();

    $list = [];
    foreach ($rows as $row) {
        $row->level = $level;
        $list[] = $row;
        $children = getSubComments($row->id, $level + 1);
        if ($children) $list = array_merge($list, $children);
    }
    return $list;
}

呼叫與輸出

$list = [];
foreach ($rootRows as $row) {
    $row->level = 0;
    $list[] = $row;
    $list = array_merge($list, getSubComments($row->id, 1));
}

foreach ($list as $row) {
    if ($row->level) {
        $pre = str_repeat('----', $row->level) . '|- ';
        echo $pre;
    }
    echo strip_tags($row->content) . '
'; }

效能與改進方向

  • N+1 查詢問題:每層遞迴執行 SQL,深度大時查詢數爆增。解決:單次查詢全表 → PHP 記憶體中建樹 (遞迴或疊代)。
  • 單次查詢建樹範例:
    $rows = $db->query('SELECT id, parent, content FROM comments')->fetchAll();
    $tree = [];
    foreach ($rows as $row) {
        $tree[$row['parent']][] = $row;
    }
    function buildTree($parent, $level, $tree) {
        $out = [];
        foreach ($tree[$parent] ?? [] as $row) {
            $row['level'] = $level;
            $out[] = $row;
            $out = array_merge($out, buildTree($row['id'], $level+1, $tree));
        }
        return $out;
    }
    $list = buildTree(0, 0, $tree);
  • 資料庫層面:MySQL 8.0+ 支援 WITH RECURSIVE CTE 直接查樹狀資料;PostgreSQL、SQL Server 同樣支援。
  • 前端渲染:傳遞 JSON 結構給 Vue/React 元件遞迴渲染,減少後端 HTML 拼接。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved