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

CodeIgniter 實現無限級分類與遞歸算法完整指南

     編輯:PHP 綜合知識

什麼是 CodeIgniter?

CodeIgniter(簡稱 CI)是一個輕量級且功能強大的 PHP 框架,基於 MVC 設計模式構建。它提供豐富的類庫、簡單易學的語法以及高效的執行效能,是許多 PHP 開發者的首選框架之一。

無限級分類的核心概念

無限級分類是指分類層級不受限制,可無限延伸的分類結構。在資料庫中通常採用「父子關係」儲存:每條記錄包含 cat_id(自身 ID)與 parent_id(父級 ID),頂層分類的 parent_id 為 0。透過遞歸演算法即可將扁平資料轉換為樹狀結構。

核心實現代碼解析

1. 遞歸構建分類樹

// 無限級分類 + 遞歸
public function digui() {
    $crr = $this->db->get('category')->result_array();
    $list['type'] = $this->nolimit($crr, 0, 0);
    $this->load->view('list1', $list);
}

public function nolimit($crr, $p_id, $level) {
    static $arr = array();
    foreach ($crr as $v) {
        if ($v['parent_id'] == $p_id) {
            $v['level'] = $level;
            $arr[] = $v;
            $this->nolimit($crr, $v['cat_id'], $level + 1);
        }
    }
    return $arr;
}

關鍵點說明:

  • 使用 static $arr 靜態變量累積結果,避免多次遞歸返回值合併的效能損耗
  • $level 參數記錄當前層級,便於前端縮進顯示
  • 一次查詢取出所有資料($crr),遞歸在記憶體中處理,減少資料庫查詢次數

2. 視圖層顯示層級縮進

<td><?php echo str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $val['level']) ?><?php echo $val['cat_name'] ?></td>

3. 替代方案:分級查詢法(適用於固定層級)

// 獲取 1~3 級分類
public function sel_child($p_id) {
    $arr = $this->sel_son($p_id);
    foreach ($arr as $k => $v) {
        $tmp = $this->sel_son($v['cat_id']);
        foreach ($tmp as $kk => $vv) {
            $tmp2 = $this->sel_son($vv['cat_id']);
            $tmp[$kk]['childs'] = $tmp2;
        }
        $arr[$k]['child'] = $tmp;
    }
    return $arr;
}

public function sel_son($id) {
    $this->db->where("parent_id=$id");
    return $this->db->get(self::$cate)->result_array();
}

4. 前端多級選單渲染範例

<?php foreach ($type as $v) { ?>
<li id="cat_1" class="">
    <h3><a href=""><?php echo $v['cat_name'] ?></a></h3>
    <?php foreach ($v['child'] as $vv) { ?>
    <dl class="clearfix">
        <dt><a href=""><?php echo $vv['cat_name'] ?></a></dt>
        <?php foreach ($vv['childs'] as $vvv) { ?>
        <a href=""><?php echo $vvv['cat_name'] ?></a>
        <?php } ?>
    </dl>
    <?php } ?>
</li>
<?php } ?>

效能優化建議

  1. 快取機制:分類資料變動較少,建議使用 Redis 或檔案快取樹狀結構,避免每次請求重新遞歸
  2. 路徑枚舉法:在資料表新增 path 欄位(如 0,1,5,12),查詢子孫/祖先只需 LIKE '0,1,5,%',極大提升查詢效能
  3. 閉包表:為複雜層級關係設計專門的關係表,支援任意深度的高效查詢

總結

CodeIgniter 實現無限級分類的核心在於「一次查詢 + 記憶體遞歸組裝」。本文提供的 nolimit() 方法結構清晰、效能優異,適合中小型專案直接使用。大型專案建議結合快取策略或改用路徑枚舉法優化資料庫層面的查詢效能。

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