資料庫儲存無限分類 (如留言板回覆、商品分類、選單) 時,需將扁平資料轉為樹狀結構並按層級輸出。本文提供 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) . '
';
}
$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);
WITH RECURSIVE CTE 直接查樹狀資料;PostgreSQL、SQL Server 同樣支援。