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

PHP 遞歸實現無限分類下拉選單:巢狀結構輸出完整範例

     編輯:PHP 綜合知識

函數定義

<?php
/**
 * 遞歸產生無限分類下拉選單
 *
 * @param int    $selected   預設選中分類 ID
 * @param int    $parent_id  父分類 ID (根節點為 0)
 * @param int    $level      當前層級 (內部遞歸用)
 * @return string HTML <option> 字串
 */
function createSortOptions($selected = 0, $parent_id = 0, $level = -1)
{
    global $db; // 假設已初始化 PDO 或 mysqli 物件

    static $counter = 0;
    $options = '';

    if ($counter === 0) {
        $options .= '<option value="0">請選擇分類</option>';
    }

    $sql = "SELECT `sort_id`, `sort_name` FROM `@__article_sort` WHERE `parent_id` = ?";
    $stmt = $db->prepare($sql);
    $stmt->execute([$parent_id]);

    if ($stmt->rowCount()) {
        $level++;
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $counter++;
            $prefix = str_repeat('&nbsp;', $level * 3); // 縮進視覺化
            $sel = ($row['sort_id'] == $selected) ? ' selected' : '';
            $options .= "<option value='{$row['sort_id']}'{$sel}>{$prefix}{$row['sort_name']}</option>\n";
            $options .= createSortOptions($selected, $row['sort_id'], $level);
        }
    }

    return $options;
}
?>

模板引擎呼叫 (Smarty 範例)

<?php
$tpl->assign('sort_list', createSortOptions());           // 新增頁
$tpl->assign('sort_list', createSortOptions($edit_id));   // 編輯頁預選
?>

前端輸出結構

<select name="sort_id">
  <option value="0">請選擇分類</option>
  <option value="1">頂層分類 A</option>
  <option value="3">&nbsp;&nbsp;&nbsp;子分類 A-1</option>
  <option value="5">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;孫分類 A-1-1</option>
  <option value="2">頂層分類 B</option>
</select>

關鍵點總結

  • static $counter 確保「請選擇」只輸出一次
  • $level 遞增控制縮進深度
  • 使用 預處理語句 防 SQL 注入
  • 回傳字串而非直接輸出,便於模板引擎整合

效能提示

分類超過千層或極大樹狀時,遞歸可能觸發記憶體/堆疊限制。建議:

  1. 改用 左/右值編碼 或 路徑枚舉 模型,單次查詢取得完整樹
  2. 或引入 closure table 關係表支援高效祖先/後代查詢
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved