PHP建站技术分享-从入门到精通_各类知识收集PHP建站技术分享-从入门到精通_各类知识收集PHP建站技术分享-从入门到精通_各类知识收集

QQ:420220301 微信/手机:150-3210-7690
当前位置:首页 > 工作总结

CI框架无限级分类+递归的实现代码

管理员 2025-03-07
工作总结
65

在 CodeIgniter (CI) 框架中实现无限级分类(如商品分类、地区分类等)通常需要结合递归算法。以下是一个完整的实现示例,包括数据库设计、模型、控制器和视图。


1. 数据库设计

假设我们有一个分类表 categories,结构如下:

字段名类型说明
idINT分类ID (主键)
parent_idINT父分类ID (0表示顶级)
nameVARCHAR(255)分类名称
sort_orderINT排序字段

SQL 示例:

sql
复制
CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    parent_id INT DEFAULT 0,
    name VARCHAR(255) NOT NULL,
    sort_order INT DEFAULT 0);

2. 模型 (Category_model.php)

在模型中,编写一个递归方法获取无限级分类数据。

php
复制
<?phpdefined('BASEPATH') OR exit('No direct script access allowed');class Category_model extends CI_Model {

    public function __construct() {
        parent::__construct();
        $this->load->database();
    }

    /**
     * 获取所有分类
     */
    public function get_categories() {
        $query = $this->db->get('categories');
        return $query->result_array();
    }

    /**
     * 递归生成树形结构
     *
     * @param array $categories 所有分类数据
     * @param int $parent_id 父分类ID
     * @return array
     */
    public function build_tree($categories, $parent_id = 0) {
        $tree = array();

        foreach ($categories as $category) {
            if ($category['parent_id'] == $parent_id) {
                // 递归获取子分类
                $children = $this->build_tree($categories, $category['id']);
                if ($children) {
                    $category['children'] = $children;
                }
                $tree[] = $category;
            }
        }

        return $tree;
    }}?>

3. 控制器 (Category.php)

在控制器中调用模型方法,并将数据传递到视图。

php
复制
<?phpdefined('BASEPATH') OR exit('No direct script access allowed');class Category extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('Category_model');
    }

    /**
     * 显示分类树
     */
    public function index() {
        // 获取所有分类数据
        $categories = $this->Category_model->get_categories();

        // 生成树形结构
        $tree = $this->Category_model->build_tree($categories);

        // 传递数据到视图
        $data['tree'] = $tree;
        $this->load->view('category_tree', $data);
    }}?>

4. 视图 (category_tree.php)

在视图中递归渲染分类树。

php
复制
<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <title>无限级分类树</title>
    <style>
        ul {
            list-style-type: none;
        }
        li {
            margin-left: 20px;
        }
    </style></head><body>
    <h1>分类树</h1>
    <ul>
        <?php echo $this->render_tree($tree); ?>
    </ul></body></html><?php/**
 * 递归渲染分类树
 *
 * @param array $tree 分类树数据
 * @return string
 */function render_tree($tree) {
    $html = '';

    foreach ($tree as $node) {
        $html .= '<li>' . $node['name'];
        if (!empty($node['children'])) {
            $html .= '<ul>' . render_tree($node['children']) . '</ul>';
        }
        $html .= '</li>';
    }

    return $html;}?>

5. 示例数据

假设 categories 表中有以下数据:

idparent_idnamesort_order
10电子产品1
21手机2
31电脑1
42智能手机1
52功能手机2
60服装2
76男装1
86女装2

6. 输出结果

访问 Category 控制器的 index 方法后,页面会渲染出以下分类树:

复制
分类树
- 电子产品
  - 手机
    - 智能手机
    - 功能手机
  - 电脑
- 服装
  - 男装
  - 女装

7. 优化建议

  1. 缓存分类数据

    • 如果分类数据不经常变化,可以将生成的树形结构缓存到文件或 Redis 中,减少数据库查询。

  2. 排序支持

    • 在递归时可以根据 sort_order 字段对分类进行排序。

  3. 前端交互

    • 可以使用 JavaScript 库(如 jQuery)实现分类树的展开/折叠功能。

  4. 性能优化

    • 如果分类数据量非常大,可以考虑使用非递归方式生成树形结构,减少递归深度。


通过以上代码,你可以在 CodeIgniter 框架中实现无限级分类,并利用递归生成树形结构。




希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。

相关推荐

扫码关注

qrcode

QQ交谈

回顶部