You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于单表创建CodeIgniter动态菜单?附表结构示例

在CodeIgniter中实现三级动态树形菜单

嘿,这个需求在CodeIgniter里实现其实挺清晰的,咱们一步步来搞定它:

1. 先在Model层处理数据,把扁平数据表转成层级结构

首先创建一个Menu_model.php文件,负责从数据库获取数据并整理成我们需要的三级数组结构:

<?php
class Menu_model extends CI_Model {
    public function get_hierarchical_menu() {
        // 查询所有菜单数据
        $query = $this->db->get('menu');
        $menu_data = $query->result_array();
        
        $hierarchical_menu = [];
        
        foreach ($menu_data as $item) {
            $main_menu = $item['menu'];
            $sub_menu = $item['submenu'];
            $child_menu = $item['childmenu'];
            
            // 初始化主菜单节点
            if (!isset($hierarchical_menu[$main_menu])) {
                $hierarchical_menu[$main_menu] = [];
            }
            
            // 初始化子菜单节点
            if (!isset($hierarchical_menu[$main_menu][$sub_menu])) {
                $hierarchical_menu[$main_menu][$sub_menu] = [];
            }
            
            // 添加子子菜单
            $hierarchical_menu[$main_menu][$sub_menu][] = $child_menu;
        }
        
        return $hierarchical_menu;
    }
}
?>

这段代码会把数据库里的扁平数据转换成主菜单 => 子菜单 => 子子菜单数组的层级结构,自动帮我们去重重复的主菜单和子菜单。

2. 在Controller层调用模型,传递数据到视图

创建一个Menu.php控制器,加载模型并获取处理好的菜单数据,传给视图:

<?php
class Menu extends CI_Controller {
    public function index() {
        // 加载模型
        $this->load->model('Menu_model');
        // 获取层级菜单数据
        $data['menu'] = $this->Menu_model->get_hierarchical_menu();
        // 加载视图并传递数据
        $this->load->view('menu_view', $data);
    }
}
?>

3. 在View层渲染树形菜单

最后创建menu_view.php视图文件,通过嵌套循环来渲染出带树形符号的菜单:

<?php foreach ($menu as $main_title => $submenus): ?>
    <?= $main_title ?>
    <?php $sub_count = count($submenus); $sub_index = 0; ?>
    <?php foreach ($submenus as $sub_title => $childmenus): ?>
        <?php $sub_index++; ?>
        <?php $is_last_sub = ($sub_index == $sub_count) ? true : false; ?>
        <?= $is_last_sub ? '└─' : '├─' ?> <?= $sub_title ?>
        <?php $child_count = count($childmenus); $child_index = 0; ?>
        <?php foreach ($childmenus as $child_title): ?>
            <?php $child_index++; ?>
            <?php $is_last_child = ($child_index == $child_count) ? true : false; ?>
            <?= $is_last_sub ? '   ' : '│  ' ?>
            <?= $is_last_child ? '└─' : '├─' ?> <?= $child_title ?>
        <?php endforeach; ?>
    <?php endforeach; ?>
<?php endforeach; ?>

这段视图代码会根据是否是最后一个子菜单/子子菜单,切换对应的树形符号(├─、└─、│),完美还原你想要的菜单样式。

额外提示

如果未来菜单层级可能扩展,你可以把视图里的渲染逻辑改成递归函数,这样不管多少层级都能通用。另外,也可以把树形符号改成CSS样式来渲染,更灵活可控。

内容的提问来源于stack exchange,提问作者Jothees P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:56:11