
在 CodeIgniter (CI) 框架中实现无限级分类(如商品分类、地区分类等)通常需要结合递归算法。以下是一个完整的实现示例,包括数据库设计、模型、控制器和视图。
1. 数据库设计
假设我们有一个分类表 categories,结构如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
id | INT | 分类ID (主键) |
parent_id | INT | 父分类ID (0表示顶级) |
name | VARCHAR(255) | 分类名称 |
sort_order | INT | 排序字段 |
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)
在模型中,编写一个递归方法获取无限级分类数据。
<?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)
在控制器中调用模型方法,并将数据传递到视图。
<?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)
在视图中递归渲染分类树。
<!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 表中有以下数据:
| id | parent_id | name | sort_order |
|---|---|---|---|
| 1 | 0 | 电子产品 | 1 |
| 2 | 1 | 手机 | 2 |
| 3 | 1 | 电脑 | 1 |
| 4 | 2 | 智能手机 | 1 |
| 5 | 2 | 功能手机 | 2 |
| 6 | 0 | 服装 | 2 |
| 7 | 6 | 男装 | 1 |
| 8 | 6 | 女装 | 2 |
6. 输出结果
访问 Category 控制器的 index 方法后,页面会渲染出以下分类树:
分类树 - 电子产品 - 手机 - 智能手机 - 功能手机 - 电脑 - 服装 - 男装 - 女装
7. 优化建议
缓存分类数据:
如果分类数据不经常变化,可以将生成的树形结构缓存到文件或 Redis 中,减少数据库查询。
排序支持:
在递归时可以根据
sort_order字段对分类进行排序。前端交互:
可以使用 JavaScript 库(如 jQuery)实现分类树的展开/折叠功能。
性能优化:
如果分类数据量非常大,可以考虑使用非递归方式生成树形结构,减少递归深度。
通过以上代码,你可以在 CodeIgniter 框架中实现无限级分类,并利用递归生成树形结构。
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。


