PHP/CodeIgniter关系数据库数组构建

PHP/CodeIgniter关系数据库数组构建,php,mysql,codeigniter,codeigniter-2,Php,Mysql,Codeigniter,Codeigniter 2,解决了!最终答案位于该问题的底部 我正在尝试使用CodeIgniter制作一个菜单生成器,出于某种原因,我似乎无法理解这个概念,即使它看起来很简单(我对PHP和CI还不熟悉)。这与CodeIgniter本身没有太大关系,因为我只在查询和MVC模式中使用它 我有两张桌子: 菜单: array( [0] => array( [menu_id] => 1, [menu_name] => 'Menu 1', [men

解决了!最终答案位于该问题的底部

我正在尝试使用CodeIgniter制作一个菜单生成器,出于某种原因,我似乎无法理解这个概念,即使它看起来很简单(我对PHP和CI还不熟悉)。这与CodeIgniter本身没有太大关系,因为我只在查询和MVC模式中使用它

我有两张桌子:

  • 菜单:

    array(  
        [0] => array(
            [menu_id]    => 1,
            [menu_name]  => 'Menu 1',
            [menu_pages] => array(
                [0] => array(
                    [id]         => 1,
                    [page_id]    => 1,
                    [menu_id]    => 1,
                    [item_name]  => 'Home',
                    [item_order] => 0,
                    [item_level] => 0,
                    [parent_id]  => ''
                ),
                [1] => array(
                    [id]         => 2,
                    [page_id]    => 2,
                    [menu_id]    => 1,
                    [item_name]  => 'About',
                    [item_order] => 0,
                    [item_level] => 0,
                    [parent_id]  => ''
                )
            )
        ),
        [1] => array(
            [menu_id]    => 2,
            [menu_name]  => 'Menu 2',
            [menu_pages] => array(
                [0] => array(
                    [id]         => 3,
                    [page_id]    => 3,
                    [menu_id]    => 2,
                    [item_name]  => 'Services',
                    [item_order] => 0,
                    [item_level] => 0,
                    [parent_id]  => ''
                ),
                [1] => array(
                    [id]         => 4,
                    [page_id]    => 4,
                    [menu_id]    => 2,
                    [item_name]  => 'Contact',
                    [item_order] => 0,
                    [item_level] => 0,
                    [parent_id]  => ''
                )
            )
        )
    )
    
    function GetMenus() {
        $menus    = $this->db->get('menus');
        $menucols = $this->db->list_fields('menus');
    
        $pages    = $this->db->get('menu_pages');
        $pagecols = $this->db->list_fields('menu_pages');
    
        $arr      = array();
        $i        = 0;
    
        foreach($menus->result() as $menu) {
            foreach($pages->result() as $page) {
                foreach($pagecols as $col) {
                    $arr[$i][$col] = $page->$col;
                }
    
                foreach($menucols as $cols) {
                    $this->menus[$i][$cols] = $menu->$cols;
    
                    if($arr[$i]['menu_id'] === $menu->id) {
                        $this->menus[$i]['menu_pages'] = $arr[$i];
                    }
                }
            }
    
            $i++;
        }
    
        return $this->menus;
    }
    
    Array(
        [0] => Array(
            [id] => 1,
            [name] => default,
            [menu_pages] => Array(
                Array( /* missing #1, showing #2/2 */
                    [id] => 2
                    [page_id] => 1
                    [menu_id] => 1
                    [item_name] => About
                    [item_order] => 0
                    [item_level] => 0
                    [parent_id] => 
                )
            )
        ),
        [1] => Array(
            [id] => 2,
            [name] => menu2,
            [menu_pages] => Array(
                Array( /* missing #3, showing #4/4 */
                    [id] => 4
                    [page_id] => 3
                    [menu_id] => 2
                    [item_name] => Contact
                    [item_order] => 0
                    [item_level] => 0
                    [parent_id] => 
                )
            )
        )
    )
    
    function GetMenus() {
        /* Yes, I know these can be chained, I unchained them to avoid
           horizontal scrolling on SO */
        $this->db->select('menus.name, menu_pages.*, pages.slug');
        $this->db->join('menu_pages', 'menu_pages.menu_id = menus.id');
        $this->db->join('pages', 'pages.id = menu_pages.page_id');
        $this->db->order_by('item_order', 'ASC');
        $menus  = $this->db->get('menus');
        $result = array();
    
        foreach($menus->result() as $menu) {
            $result[$menu->name][$menu->id] = array(
                'page_id'    => $menu->page_id,
                'menu_id'    => $menu->menu_id,
                'item_name'  => $menu->item_name,
                'item_slug'  => $menu->slug,
                'item_order' => $menu->item_order,
                'item_level' => $menu->item_level,
                'parent_id'  => $menu->parent_id
            );
        }
    
        return $result;
    }
    
    $this->menu = $this->page->GetMenus();
    
    <ul class="nav">
        <?php foreach($this->menu['default'] as $item) { ?>
            <li>
                <a href="<?php echo $item['item_slug']; ?>">
                    <?php echo $item['item_name']; ?>
                </a>
            </li>
        <?php } ?>
    </ul>
    
    • 身份证
    • 名字
  • 菜单页面:

    array(  
        [0] => array(
            [menu_id]    => 1,
            [menu_name]  => 'Menu 1',
            [menu_pages] => array(
                [0] => array(
                    [id]         => 1,
                    [page_id]    => 1,
                    [menu_id]    => 1,
                    [item_name]  => 'Home',
                    [item_order] => 0,
                    [item_level] => 0,
                    [parent_id]  => ''
                ),
                [1] => array(
                    [id]         => 2,
                    [page_id]    => 2,
                    [menu_id]    => 1,
                    [item_name]  => 'About',
                    [item_order] => 0,
                    [item_level] => 0,
                    [parent_id]  => ''
                )
            )
        ),
        [1] => array(
            [menu_id]    => 2,
            [menu_name]  => 'Menu 2',
            [menu_pages] => array(
                [0] => array(
                    [id]         => 3,
                    [page_id]    => 3,
                    [menu_id]    => 2,
                    [item_name]  => 'Services',
                    [item_order] => 0,
                    [item_level] => 0,
                    [parent_id]  => ''
                ),
                [1] => array(
                    [id]         => 4,
                    [page_id]    => 4,
                    [menu_id]    => 2,
                    [item_name]  => 'Contact',
                    [item_order] => 0,
                    [item_level] => 0,
                    [parent_id]  => ''
                )
            )
        )
    )
    
    function GetMenus() {
        $menus    = $this->db->get('menus');
        $menucols = $this->db->list_fields('menus');
    
        $pages    = $this->db->get('menu_pages');
        $pagecols = $this->db->list_fields('menu_pages');
    
        $arr      = array();
        $i        = 0;
    
        foreach($menus->result() as $menu) {
            foreach($pages->result() as $page) {
                foreach($pagecols as $col) {
                    $arr[$i][$col] = $page->$col;
                }
    
                foreach($menucols as $cols) {
                    $this->menus[$i][$cols] = $menu->$cols;
    
                    if($arr[$i]['menu_id'] === $menu->id) {
                        $this->menus[$i]['menu_pages'] = $arr[$i];
                    }
                }
            }
    
            $i++;
        }
    
        return $this->menus;
    }
    
    Array(
        [0] => Array(
            [id] => 1,
            [name] => default,
            [menu_pages] => Array(
                Array( /* missing #1, showing #2/2 */
                    [id] => 2
                    [page_id] => 1
                    [menu_id] => 1
                    [item_name] => About
                    [item_order] => 0
                    [item_level] => 0
                    [parent_id] => 
                )
            )
        ),
        [1] => Array(
            [id] => 2,
            [name] => menu2,
            [menu_pages] => Array(
                Array( /* missing #3, showing #4/4 */
                    [id] => 4
                    [page_id] => 3
                    [menu_id] => 2
                    [item_name] => Contact
                    [item_order] => 0
                    [item_level] => 0
                    [parent_id] => 
                )
            )
        )
    )
    
    function GetMenus() {
        /* Yes, I know these can be chained, I unchained them to avoid
           horizontal scrolling on SO */
        $this->db->select('menus.name, menu_pages.*, pages.slug');
        $this->db->join('menu_pages', 'menu_pages.menu_id = menus.id');
        $this->db->join('pages', 'pages.id = menu_pages.page_id');
        $this->db->order_by('item_order', 'ASC');
        $menus  = $this->db->get('menus');
        $result = array();
    
        foreach($menus->result() as $menu) {
            $result[$menu->name][$menu->id] = array(
                'page_id'    => $menu->page_id,
                'menu_id'    => $menu->menu_id,
                'item_name'  => $menu->item_name,
                'item_slug'  => $menu->slug,
                'item_order' => $menu->item_order,
                'item_level' => $menu->item_level,
                'parent_id'  => $menu->parent_id
            );
        }
    
        return $result;
    }
    
    $this->menu = $this->page->GetMenus();
    
    <ul class="nav">
        <?php foreach($this->menu['default'] as $item) { ?>
            <li>
                <a href="<?php echo $item['item_slug']; ?>">
                    <?php echo $item['item_name']; ?>
                </a>
            </li>
        <?php } ?>
    </ul>
    
    • 身份证
    • 页面id(与pages.id相关)
    • 菜单id(与menus.id相关)
    • 项目名称(它在菜单中的显示方式)
    • 项目订单(用于分拣)
    • 项目\父项(用于在子菜单中嵌套项目)
编辑:这是我希望实现的结构:

array(  
    [0] => array(
        [menu_id]    => 1,
        [menu_name]  => 'Menu 1',
        [menu_pages] => array(
            [0] => array(
                [id]         => 1,
                [page_id]    => 1,
                [menu_id]    => 1,
                [item_name]  => 'Home',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            ),
            [1] => array(
                [id]         => 2,
                [page_id]    => 2,
                [menu_id]    => 1,
                [item_name]  => 'About',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            )
        )
    ),
    [1] => array(
        [menu_id]    => 2,
        [menu_name]  => 'Menu 2',
        [menu_pages] => array(
            [0] => array(
                [id]         => 3,
                [page_id]    => 3,
                [menu_id]    => 2,
                [item_name]  => 'Services',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            ),
            [1] => array(
                [id]         => 4,
                [page_id]    => 4,
                [menu_id]    => 2,
                [item_name]  => 'Contact',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            )
        )
    )
)
function GetMenus() {
    $menus    = $this->db->get('menus');
    $menucols = $this->db->list_fields('menus');

    $pages    = $this->db->get('menu_pages');
    $pagecols = $this->db->list_fields('menu_pages');

    $arr      = array();
    $i        = 0;

    foreach($menus->result() as $menu) {
        foreach($pages->result() as $page) {
            foreach($pagecols as $col) {
                $arr[$i][$col] = $page->$col;
            }

            foreach($menucols as $cols) {
                $this->menus[$i][$cols] = $menu->$cols;

                if($arr[$i]['menu_id'] === $menu->id) {
                    $this->menus[$i]['menu_pages'] = $arr[$i];
                }
            }
        }

        $i++;
    }

    return $this->menus;
}
Array(
    [0] => Array(
        [id] => 1,
        [name] => default,
        [menu_pages] => Array(
            Array( /* missing #1, showing #2/2 */
                [id] => 2
                [page_id] => 1
                [menu_id] => 1
                [item_name] => About
                [item_order] => 0
                [item_level] => 0
                [parent_id] => 
            )
        )
    ),
    [1] => Array(
        [id] => 2,
        [name] => menu2,
        [menu_pages] => Array(
            Array( /* missing #3, showing #4/4 */
                [id] => 4
                [page_id] => 3
                [menu_id] => 2
                [item_name] => Contact
                [item_order] => 0
                [item_level] => 0
                [parent_id] => 
            )
        )
    )
)
function GetMenus() {
    /* Yes, I know these can be chained, I unchained them to avoid
       horizontal scrolling on SO */
    $this->db->select('menus.name, menu_pages.*, pages.slug');
    $this->db->join('menu_pages', 'menu_pages.menu_id = menus.id');
    $this->db->join('pages', 'pages.id = menu_pages.page_id');
    $this->db->order_by('item_order', 'ASC');
    $menus  = $this->db->get('menus');
    $result = array();

    foreach($menus->result() as $menu) {
        $result[$menu->name][$menu->id] = array(
            'page_id'    => $menu->page_id,
            'menu_id'    => $menu->menu_id,
            'item_name'  => $menu->item_name,
            'item_slug'  => $menu->slug,
            'item_order' => $menu->item_order,
            'item_level' => $menu->item_level,
            'parent_id'  => $menu->parent_id
        );
    }

    return $result;
}
$this->menu = $this->page->GetMenus();
<ul class="nav">
    <?php foreach($this->menu['default'] as $item) { ?>
        <li>
            <a href="<?php echo $item['item_slug']; ?>">
                <?php echo $item['item_name']; ?>
            </a>
        </li>
    <?php } ?>
</ul>
以下是我到目前为止得到的信息(更新):

array(  
    [0] => array(
        [menu_id]    => 1,
        [menu_name]  => 'Menu 1',
        [menu_pages] => array(
            [0] => array(
                [id]         => 1,
                [page_id]    => 1,
                [menu_id]    => 1,
                [item_name]  => 'Home',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            ),
            [1] => array(
                [id]         => 2,
                [page_id]    => 2,
                [menu_id]    => 1,
                [item_name]  => 'About',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            )
        )
    ),
    [1] => array(
        [menu_id]    => 2,
        [menu_name]  => 'Menu 2',
        [menu_pages] => array(
            [0] => array(
                [id]         => 3,
                [page_id]    => 3,
                [menu_id]    => 2,
                [item_name]  => 'Services',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            ),
            [1] => array(
                [id]         => 4,
                [page_id]    => 4,
                [menu_id]    => 2,
                [item_name]  => 'Contact',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            )
        )
    )
)
function GetMenus() {
    $menus    = $this->db->get('menus');
    $menucols = $this->db->list_fields('menus');

    $pages    = $this->db->get('menu_pages');
    $pagecols = $this->db->list_fields('menu_pages');

    $arr      = array();
    $i        = 0;

    foreach($menus->result() as $menu) {
        foreach($pages->result() as $page) {
            foreach($pagecols as $col) {
                $arr[$i][$col] = $page->$col;
            }

            foreach($menucols as $cols) {
                $this->menus[$i][$cols] = $menu->$cols;

                if($arr[$i]['menu_id'] === $menu->id) {
                    $this->menus[$i]['menu_pages'] = $arr[$i];
                }
            }
        }

        $i++;
    }

    return $this->menus;
}
Array(
    [0] => Array(
        [id] => 1,
        [name] => default,
        [menu_pages] => Array(
            Array( /* missing #1, showing #2/2 */
                [id] => 2
                [page_id] => 1
                [menu_id] => 1
                [item_name] => About
                [item_order] => 0
                [item_level] => 0
                [parent_id] => 
            )
        )
    ),
    [1] => Array(
        [id] => 2,
        [name] => menu2,
        [menu_pages] => Array(
            Array( /* missing #3, showing #4/4 */
                [id] => 4
                [page_id] => 3
                [menu_id] => 2
                [item_name] => Contact
                [item_order] => 0
                [item_level] => 0
                [parent_id] => 
            )
        )
    )
)
function GetMenus() {
    /* Yes, I know these can be chained, I unchained them to avoid
       horizontal scrolling on SO */
    $this->db->select('menus.name, menu_pages.*, pages.slug');
    $this->db->join('menu_pages', 'menu_pages.menu_id = menus.id');
    $this->db->join('pages', 'pages.id = menu_pages.page_id');
    $this->db->order_by('item_order', 'ASC');
    $menus  = $this->db->get('menus');
    $result = array();

    foreach($menus->result() as $menu) {
        $result[$menu->name][$menu->id] = array(
            'page_id'    => $menu->page_id,
            'menu_id'    => $menu->menu_id,
            'item_name'  => $menu->item_name,
            'item_slug'  => $menu->slug,
            'item_order' => $menu->item_order,
            'item_level' => $menu->item_level,
            'parent_id'  => $menu->parent_id
        );
    }

    return $result;
}
$this->menu = $this->page->GetMenus();
<ul class="nav">
    <?php foreach($this->menu['default'] as $item) { ?>
        <li>
            <a href="<?php echo $item['item_slug']; ?>">
                <?php echo $item['item_name']; ?>
            </a>
        </li>
    <?php } ?>
</ul>
以上实际输出:

array(  
    [0] => array(
        [menu_id]    => 1,
        [menu_name]  => 'Menu 1',
        [menu_pages] => array(
            [0] => array(
                [id]         => 1,
                [page_id]    => 1,
                [menu_id]    => 1,
                [item_name]  => 'Home',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            ),
            [1] => array(
                [id]         => 2,
                [page_id]    => 2,
                [menu_id]    => 1,
                [item_name]  => 'About',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            )
        )
    ),
    [1] => array(
        [menu_id]    => 2,
        [menu_name]  => 'Menu 2',
        [menu_pages] => array(
            [0] => array(
                [id]         => 3,
                [page_id]    => 3,
                [menu_id]    => 2,
                [item_name]  => 'Services',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            ),
            [1] => array(
                [id]         => 4,
                [page_id]    => 4,
                [menu_id]    => 2,
                [item_name]  => 'Contact',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            )
        )
    )
)
function GetMenus() {
    $menus    = $this->db->get('menus');
    $menucols = $this->db->list_fields('menus');

    $pages    = $this->db->get('menu_pages');
    $pagecols = $this->db->list_fields('menu_pages');

    $arr      = array();
    $i        = 0;

    foreach($menus->result() as $menu) {
        foreach($pages->result() as $page) {
            foreach($pagecols as $col) {
                $arr[$i][$col] = $page->$col;
            }

            foreach($menucols as $cols) {
                $this->menus[$i][$cols] = $menu->$cols;

                if($arr[$i]['menu_id'] === $menu->id) {
                    $this->menus[$i]['menu_pages'] = $arr[$i];
                }
            }
        }

        $i++;
    }

    return $this->menus;
}
Array(
    [0] => Array(
        [id] => 1,
        [name] => default,
        [menu_pages] => Array(
            Array( /* missing #1, showing #2/2 */
                [id] => 2
                [page_id] => 1
                [menu_id] => 1
                [item_name] => About
                [item_order] => 0
                [item_level] => 0
                [parent_id] => 
            )
        )
    ),
    [1] => Array(
        [id] => 2,
        [name] => menu2,
        [menu_pages] => Array(
            Array( /* missing #3, showing #4/4 */
                [id] => 4
                [page_id] => 3
                [menu_id] => 2
                [item_name] => Contact
                [item_order] => 0
                [item_level] => 0
                [parent_id] => 
            )
        )
    )
)
function GetMenus() {
    /* Yes, I know these can be chained, I unchained them to avoid
       horizontal scrolling on SO */
    $this->db->select('menus.name, menu_pages.*, pages.slug');
    $this->db->join('menu_pages', 'menu_pages.menu_id = menus.id');
    $this->db->join('pages', 'pages.id = menu_pages.page_id');
    $this->db->order_by('item_order', 'ASC');
    $menus  = $this->db->get('menus');
    $result = array();

    foreach($menus->result() as $menu) {
        $result[$menu->name][$menu->id] = array(
            'page_id'    => $menu->page_id,
            'menu_id'    => $menu->menu_id,
            'item_name'  => $menu->item_name,
            'item_slug'  => $menu->slug,
            'item_order' => $menu->item_order,
            'item_level' => $menu->item_level,
            'parent_id'  => $menu->parent_id
        );
    }

    return $result;
}
$this->menu = $this->page->GetMenus();
<ul class="nav">
    <?php foreach($this->menu['default'] as $item) { ?>
        <li>
            <a href="<?php echo $item['item_slug']; ?>">
                <?php echo $item['item_name']; ?>
            </a>
        </li>
    <?php } ?>
</ul>
正如您所看到的,这与我所需要的非常接近,但是缺少了一些项,因为它们似乎在数组中被覆盖(它只显示每个菜单的最后一个菜单项-似乎它们具有相同的键)

谢谢你的帮助和建议

编辑:这是最终的解决方案,大致基于米沙的答案:

array(  
    [0] => array(
        [menu_id]    => 1,
        [menu_name]  => 'Menu 1',
        [menu_pages] => array(
            [0] => array(
                [id]         => 1,
                [page_id]    => 1,
                [menu_id]    => 1,
                [item_name]  => 'Home',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            ),
            [1] => array(
                [id]         => 2,
                [page_id]    => 2,
                [menu_id]    => 1,
                [item_name]  => 'About',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            )
        )
    ),
    [1] => array(
        [menu_id]    => 2,
        [menu_name]  => 'Menu 2',
        [menu_pages] => array(
            [0] => array(
                [id]         => 3,
                [page_id]    => 3,
                [menu_id]    => 2,
                [item_name]  => 'Services',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            ),
            [1] => array(
                [id]         => 4,
                [page_id]    => 4,
                [menu_id]    => 2,
                [item_name]  => 'Contact',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            )
        )
    )
)
function GetMenus() {
    $menus    = $this->db->get('menus');
    $menucols = $this->db->list_fields('menus');

    $pages    = $this->db->get('menu_pages');
    $pagecols = $this->db->list_fields('menu_pages');

    $arr      = array();
    $i        = 0;

    foreach($menus->result() as $menu) {
        foreach($pages->result() as $page) {
            foreach($pagecols as $col) {
                $arr[$i][$col] = $page->$col;
            }

            foreach($menucols as $cols) {
                $this->menus[$i][$cols] = $menu->$cols;

                if($arr[$i]['menu_id'] === $menu->id) {
                    $this->menus[$i]['menu_pages'] = $arr[$i];
                }
            }
        }

        $i++;
    }

    return $this->menus;
}
Array(
    [0] => Array(
        [id] => 1,
        [name] => default,
        [menu_pages] => Array(
            Array( /* missing #1, showing #2/2 */
                [id] => 2
                [page_id] => 1
                [menu_id] => 1
                [item_name] => About
                [item_order] => 0
                [item_level] => 0
                [parent_id] => 
            )
        )
    ),
    [1] => Array(
        [id] => 2,
        [name] => menu2,
        [menu_pages] => Array(
            Array( /* missing #3, showing #4/4 */
                [id] => 4
                [page_id] => 3
                [menu_id] => 2
                [item_name] => Contact
                [item_order] => 0
                [item_level] => 0
                [parent_id] => 
            )
        )
    )
)
function GetMenus() {
    /* Yes, I know these can be chained, I unchained them to avoid
       horizontal scrolling on SO */
    $this->db->select('menus.name, menu_pages.*, pages.slug');
    $this->db->join('menu_pages', 'menu_pages.menu_id = menus.id');
    $this->db->join('pages', 'pages.id = menu_pages.page_id');
    $this->db->order_by('item_order', 'ASC');
    $menus  = $this->db->get('menus');
    $result = array();

    foreach($menus->result() as $menu) {
        $result[$menu->name][$menu->id] = array(
            'page_id'    => $menu->page_id,
            'menu_id'    => $menu->menu_id,
            'item_name'  => $menu->item_name,
            'item_slug'  => $menu->slug,
            'item_order' => $menu->item_order,
            'item_level' => $menu->item_level,
            'parent_id'  => $menu->parent_id
        );
    }

    return $result;
}
$this->menu = $this->page->GetMenus();
<ul class="nav">
    <?php foreach($this->menu['default'] as $item) { ?>
        <li>
            <a href="<?php echo $item['item_slug']; ?>">
                <?php echo $item['item_name']; ?>
            </a>
        </li>
    <?php } ?>
</ul>
型号:

array(  
    [0] => array(
        [menu_id]    => 1,
        [menu_name]  => 'Menu 1',
        [menu_pages] => array(
            [0] => array(
                [id]         => 1,
                [page_id]    => 1,
                [menu_id]    => 1,
                [item_name]  => 'Home',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            ),
            [1] => array(
                [id]         => 2,
                [page_id]    => 2,
                [menu_id]    => 1,
                [item_name]  => 'About',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            )
        )
    ),
    [1] => array(
        [menu_id]    => 2,
        [menu_name]  => 'Menu 2',
        [menu_pages] => array(
            [0] => array(
                [id]         => 3,
                [page_id]    => 3,
                [menu_id]    => 2,
                [item_name]  => 'Services',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            ),
            [1] => array(
                [id]         => 4,
                [page_id]    => 4,
                [menu_id]    => 2,
                [item_name]  => 'Contact',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            )
        )
    )
)
function GetMenus() {
    $menus    = $this->db->get('menus');
    $menucols = $this->db->list_fields('menus');

    $pages    = $this->db->get('menu_pages');
    $pagecols = $this->db->list_fields('menu_pages');

    $arr      = array();
    $i        = 0;

    foreach($menus->result() as $menu) {
        foreach($pages->result() as $page) {
            foreach($pagecols as $col) {
                $arr[$i][$col] = $page->$col;
            }

            foreach($menucols as $cols) {
                $this->menus[$i][$cols] = $menu->$cols;

                if($arr[$i]['menu_id'] === $menu->id) {
                    $this->menus[$i]['menu_pages'] = $arr[$i];
                }
            }
        }

        $i++;
    }

    return $this->menus;
}
Array(
    [0] => Array(
        [id] => 1,
        [name] => default,
        [menu_pages] => Array(
            Array( /* missing #1, showing #2/2 */
                [id] => 2
                [page_id] => 1
                [menu_id] => 1
                [item_name] => About
                [item_order] => 0
                [item_level] => 0
                [parent_id] => 
            )
        )
    ),
    [1] => Array(
        [id] => 2,
        [name] => menu2,
        [menu_pages] => Array(
            Array( /* missing #3, showing #4/4 */
                [id] => 4
                [page_id] => 3
                [menu_id] => 2
                [item_name] => Contact
                [item_order] => 0
                [item_level] => 0
                [parent_id] => 
            )
        )
    )
)
function GetMenus() {
    /* Yes, I know these can be chained, I unchained them to avoid
       horizontal scrolling on SO */
    $this->db->select('menus.name, menu_pages.*, pages.slug');
    $this->db->join('menu_pages', 'menu_pages.menu_id = menus.id');
    $this->db->join('pages', 'pages.id = menu_pages.page_id');
    $this->db->order_by('item_order', 'ASC');
    $menus  = $this->db->get('menus');
    $result = array();

    foreach($menus->result() as $menu) {
        $result[$menu->name][$menu->id] = array(
            'page_id'    => $menu->page_id,
            'menu_id'    => $menu->menu_id,
            'item_name'  => $menu->item_name,
            'item_slug'  => $menu->slug,
            'item_order' => $menu->item_order,
            'item_level' => $menu->item_level,
            'parent_id'  => $menu->parent_id
        );
    }

    return $result;
}
$this->menu = $this->page->GetMenus();
<ul class="nav">
    <?php foreach($this->menu['default'] as $item) { ?>
        <li>
            <a href="<?php echo $item['item_slug']; ?>">
                <?php echo $item['item_name']; ?>
            </a>
        </li>
    <?php } ?>
</ul>
控制器:

array(  
    [0] => array(
        [menu_id]    => 1,
        [menu_name]  => 'Menu 1',
        [menu_pages] => array(
            [0] => array(
                [id]         => 1,
                [page_id]    => 1,
                [menu_id]    => 1,
                [item_name]  => 'Home',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            ),
            [1] => array(
                [id]         => 2,
                [page_id]    => 2,
                [menu_id]    => 1,
                [item_name]  => 'About',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            )
        )
    ),
    [1] => array(
        [menu_id]    => 2,
        [menu_name]  => 'Menu 2',
        [menu_pages] => array(
            [0] => array(
                [id]         => 3,
                [page_id]    => 3,
                [menu_id]    => 2,
                [item_name]  => 'Services',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            ),
            [1] => array(
                [id]         => 4,
                [page_id]    => 4,
                [menu_id]    => 2,
                [item_name]  => 'Contact',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            )
        )
    )
)
function GetMenus() {
    $menus    = $this->db->get('menus');
    $menucols = $this->db->list_fields('menus');

    $pages    = $this->db->get('menu_pages');
    $pagecols = $this->db->list_fields('menu_pages');

    $arr      = array();
    $i        = 0;

    foreach($menus->result() as $menu) {
        foreach($pages->result() as $page) {
            foreach($pagecols as $col) {
                $arr[$i][$col] = $page->$col;
            }

            foreach($menucols as $cols) {
                $this->menus[$i][$cols] = $menu->$cols;

                if($arr[$i]['menu_id'] === $menu->id) {
                    $this->menus[$i]['menu_pages'] = $arr[$i];
                }
            }
        }

        $i++;
    }

    return $this->menus;
}
Array(
    [0] => Array(
        [id] => 1,
        [name] => default,
        [menu_pages] => Array(
            Array( /* missing #1, showing #2/2 */
                [id] => 2
                [page_id] => 1
                [menu_id] => 1
                [item_name] => About
                [item_order] => 0
                [item_level] => 0
                [parent_id] => 
            )
        )
    ),
    [1] => Array(
        [id] => 2,
        [name] => menu2,
        [menu_pages] => Array(
            Array( /* missing #3, showing #4/4 */
                [id] => 4
                [page_id] => 3
                [menu_id] => 2
                [item_name] => Contact
                [item_order] => 0
                [item_level] => 0
                [parent_id] => 
            )
        )
    )
)
function GetMenus() {
    /* Yes, I know these can be chained, I unchained them to avoid
       horizontal scrolling on SO */
    $this->db->select('menus.name, menu_pages.*, pages.slug');
    $this->db->join('menu_pages', 'menu_pages.menu_id = menus.id');
    $this->db->join('pages', 'pages.id = menu_pages.page_id');
    $this->db->order_by('item_order', 'ASC');
    $menus  = $this->db->get('menus');
    $result = array();

    foreach($menus->result() as $menu) {
        $result[$menu->name][$menu->id] = array(
            'page_id'    => $menu->page_id,
            'menu_id'    => $menu->menu_id,
            'item_name'  => $menu->item_name,
            'item_slug'  => $menu->slug,
            'item_order' => $menu->item_order,
            'item_level' => $menu->item_level,
            'parent_id'  => $menu->parent_id
        );
    }

    return $result;
}
$this->menu = $this->page->GetMenus();
<ul class="nav">
    <?php foreach($this->menu['default'] as $item) { ?>
        <li>
            <a href="<?php echo $item['item_slug']; ?>">
                <?php echo $item['item_name']; ?>
            </a>
        </li>
    <?php } ?>
</ul>
查看:

array(  
    [0] => array(
        [menu_id]    => 1,
        [menu_name]  => 'Menu 1',
        [menu_pages] => array(
            [0] => array(
                [id]         => 1,
                [page_id]    => 1,
                [menu_id]    => 1,
                [item_name]  => 'Home',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            ),
            [1] => array(
                [id]         => 2,
                [page_id]    => 2,
                [menu_id]    => 1,
                [item_name]  => 'About',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            )
        )
    ),
    [1] => array(
        [menu_id]    => 2,
        [menu_name]  => 'Menu 2',
        [menu_pages] => array(
            [0] => array(
                [id]         => 3,
                [page_id]    => 3,
                [menu_id]    => 2,
                [item_name]  => 'Services',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            ),
            [1] => array(
                [id]         => 4,
                [page_id]    => 4,
                [menu_id]    => 2,
                [item_name]  => 'Contact',
                [item_order] => 0,
                [item_level] => 0,
                [parent_id]  => ''
            )
        )
    )
)
function GetMenus() {
    $menus    = $this->db->get('menus');
    $menucols = $this->db->list_fields('menus');

    $pages    = $this->db->get('menu_pages');
    $pagecols = $this->db->list_fields('menu_pages');

    $arr      = array();
    $i        = 0;

    foreach($menus->result() as $menu) {
        foreach($pages->result() as $page) {
            foreach($pagecols as $col) {
                $arr[$i][$col] = $page->$col;
            }

            foreach($menucols as $cols) {
                $this->menus[$i][$cols] = $menu->$cols;

                if($arr[$i]['menu_id'] === $menu->id) {
                    $this->menus[$i]['menu_pages'] = $arr[$i];
                }
            }
        }

        $i++;
    }

    return $this->menus;
}
Array(
    [0] => Array(
        [id] => 1,
        [name] => default,
        [menu_pages] => Array(
            Array( /* missing #1, showing #2/2 */
                [id] => 2
                [page_id] => 1
                [menu_id] => 1
                [item_name] => About
                [item_order] => 0
                [item_level] => 0
                [parent_id] => 
            )
        )
    ),
    [1] => Array(
        [id] => 2,
        [name] => menu2,
        [menu_pages] => Array(
            Array( /* missing #3, showing #4/4 */
                [id] => 4
                [page_id] => 3
                [menu_id] => 2
                [item_name] => Contact
                [item_order] => 0
                [item_level] => 0
                [parent_id] => 
            )
        )
    )
)
function GetMenus() {
    /* Yes, I know these can be chained, I unchained them to avoid
       horizontal scrolling on SO */
    $this->db->select('menus.name, menu_pages.*, pages.slug');
    $this->db->join('menu_pages', 'menu_pages.menu_id = menus.id');
    $this->db->join('pages', 'pages.id = menu_pages.page_id');
    $this->db->order_by('item_order', 'ASC');
    $menus  = $this->db->get('menus');
    $result = array();

    foreach($menus->result() as $menu) {
        $result[$menu->name][$menu->id] = array(
            'page_id'    => $menu->page_id,
            'menu_id'    => $menu->menu_id,
            'item_name'  => $menu->item_name,
            'item_slug'  => $menu->slug,
            'item_order' => $menu->item_order,
            'item_level' => $menu->item_level,
            'parent_id'  => $menu->parent_id
        );
    }

    return $result;
}
$this->menu = $this->page->GetMenus();
<ul class="nav">
    <?php foreach($this->menu['default'] as $item) { ?>
        <li>
            <a href="<?php echo $item['item_slug']; ?>">
                <?php echo $item['item_name']; ?>
            </a>
        </li>
    <?php } ?>
</ul>

然后在php端展开单元格

您可以将$this->菜单声明为:

$this->menus = array()
并使用
array\u push()
函数,如下所示:

array_push($this->menus,$page->$col);
我还建议您在模型中执行联接操作,而不是在函数中循环,因为数据库可以快速执行,而且您的代码看起来也很优雅。

试试这个:

function GetMenus() {
    $menus = $this->db->get('menus');
    $pages = $this->db->get('menu_pages');
    $cols  = $this->db->list_fields('menu_pages');

    foreach($menus->result() as $menu) {
        $this->menus[$menu->id] = $menu;
        foreach($pages->result() as $page) {
            if($page->menu_id === $menu->id) { 
                foreach($cols as $col) {
                    $this->menus[$menu->id][$col][] = $page->$col;
                }
            }
        }
    }

    print_r($this->menus); // for debugging to see result

    return $this->menus;
}

您有两个查询,但我想我会选择带有连接的单个查询。这使得代码更短、更简单。我还没有测试下面的代码,但类似的东西应该可以工作:

function GetMenus()
{
  $this->db->select('menus.name, menu_pages.*');
  $this->db->join('menu_pages', 'menu_pages.menu_id = menus.id');
  $this->db->order_by('menus.id');
  $q = $this->db->get('menus');

  $result = array();
  $current_menu_id = NULL;
  $i = -1;

  foreach($q->result() as $row)
  {
    if($current_menu_id !== $row->menu_id)
    {
      $i++;
      $result[] = array('menu_id' => $row->menu_id,
                        'menu_name' => $row->name,
                        'menu_pages' => array()
                  );
    }

    $result[$i]['menu_pages'][] = array('id' => $row->id,
                                        'page_id' => $row->page_id,
                                        'menu_id' => $row->menu_id,
                                        'item_name' => $row->item_name,
                                        'item_order' => $row->item_order,
                                        'item_level' => $row->item_level,
                                        'parent_id' => $row->parent_id
                                  );

    $current_menu_id = $row->menu_id;
  }

  return $result;
}

如果您不了解第一次打印的结果,请查看您的答复,但我认为没有必要在这里进行连接,因为page\u id已经与pages.id相关,menu\u id与menus.id作为索引相关。我已经能够得到menu_id和page_id的结果,所以我似乎应该能够使用php来构建所有菜单和属于它们的页面的数组?我可能错了-请进一步解释。如果我是你,我会使用单张表,单张表中的自连接识别父id为0的父菜单和>0的子菜单。这里有一些教程,请参阅本论坛。它最初是一张表,但我发现需要将它们分开,原因有很多。例如,“菜单”表中的每一行都是一个新菜单,“菜单页面”表中的每一行都代表一个页面,该页面与菜单id(
menu\u pages.page\u id=>menus.id
)相关联。这就是为什么我认为我无法将实际页面添加到菜单表中-菜单及其关联页面似乎需要位于单独但相关的表中。我已经在类的顶部有了
$menus=array()
,很抱歉没有澄清(尽管这是通过在代码中使用
$this->menus
暗示的)。据我所知,不需要使用
array_push()
,因为
$menus['key']=$val
应该做同样的事情。它需要是多层面的。谢谢你的回复!嗯,沙扬,这是伟大的使用列表_领域,人们通常避免use@ChrisClower我已经更新了我的代码,请检查并让我知道它是否有效not@ChrisClower请将空索引放在$col前面。我已经更新了代码。现在,我已经在数组中添加了菜单数据。试试看,让我知道它是否有效。好的,把这行代码转换成$this->menus[$menu->id]['menu\u pages'][=$page->$colWow,我想你得到了(甚至没有测试代码?!我直接粘贴了它,没有任何更改!)我刚才打印的数组很漂亮!给我几分钟时间添加一些记录和测试,但我认为这是一个!我们赢了!非常感谢DIt说我要等19个小时才能颁发奖金,但我肯定会的!很高兴它起作用了。这不考虑
parent\u id
内容。如果你想考虑嵌套菜单,代码会变得更复杂,但对于你在问题中描述的,我认为这是最简单的解决方案。是的,这将是下一步(父母和孩子),这可能会变得混乱,因为它可能会添加更多的维度和嵌套数组。对我来说,这是一个hella复杂的数组,试图为现在的东西构建,哈哈。