我有一个测试数据库表,其名称为autos,如下面的
我在模型中使用递归函数来获取数组中的数据并将其转储。它看起来很像跟随
Array
(
[menu] => Array
(
[0] => Array
(
[id] => 1
[name] => Automobiles
[parent] => 0
[child] => Array
(
[0] => Array
(
[id] => 2
[name] => Honda
[parent] => 1
[child] => Array
(
[0] => Array
(
[id] => 3
[name] => Cars
[parent] => 2
[child] => Array
(
[0] => Array
(
[id] => 4
[name] => Civic
[parent] => 3
[child] => Array
(
[0] => Array
(
[id] => 5
[name] => Prosmetic
[parent] => 4
)
)
)
)
)
)
)
在我看来,我正在创建一个标准引导程序multi-level dropdown,但我没有得到所有子菜单
问题:我没有得到所有孩子
我相信我找到了我的视图代码中的原因。以下是呈现下拉列表的代码片段
<div class="dropdown">
<button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">Menu<span class="caret"></span></button>
<ul class="dropdown-menu">
<?php for($i=0;$i<count($menu);$i++){?>
<?php if(!empty($menu[$i]['child'])){?>
<li class="dropdown-submenu">
<a class="test" href="#"><?php echo $menu[$i]['name']?> <span class="caret"></span></a>
<ul class="dropdown-menu">
<?php for($j=0;$j<count($menu[$i]['child']);$j++){?>
<li><a href="#"><?php echo $menu[$i]['child'][$j]['name']?></a></li>
<?php }?>
</ul>
</li>
<?php }else{?>
<li><a tabindex="-1" href="#"><?php echo $menu[$i]['name']?></a></li>
<?php }}?>
</ul>
</div>
我只能得到一级孩子,因为我只是检查一级孩子。如何在视图中重复(递归)执行此操作。我不能只是继续检查孩子的子孩子等等。必须有办法。有人能指出我正确的方向吗?
编辑:我的模型
function getCategoriesByParentId($category_id) {
$data = $this->db->select('*')->from('autos')->WHERE('parent',$category_id)->get()->result_array();
for($i=0;$i<count($data);$i++)
{
if($this->getCategoriesByParentId($data[$i]['id']))
{
$data[$i]['child']=$this->getCategoriesByParentId($data[$i]['id']);
}
}
return $data;
}
我的控制器
public function index()
{
$this->load->model('Test_model');
$data['menu']=$this->Test_model->getCategoriesByParentId(0);
//echo '<pre>';print_r(($data));echo '</pre>';exit;
$data['title']='testing';
$this->load->view('head',$data);
$this->load->view('dropdown');
}
我插入了更多类别和子类别。现在菜单看起来像这样
答案 0 :(得分:1)
递归函数可能会有所帮助。它可以放在一个帮助文件中,然后你可以从像printMenu($menu);
更新示例: 如果您需要排除数组中的第一个元素,因为您似乎想要将其标识为父元素,您可以执行以下操作:
HELPER:(例如menu_helper.php
放入文件夹帮助程序)
function printMenu($a) {
if (!is_array($a)) {
return;
}
foreach($a as $m) {
if($m['parent'] > 0){
echo '<li><a tabindex="-1" href="#">'. $m['name'] .'</a></li>';
}
if(is_array($m['child'])){
printMenu($m['child']);
}
}
}
查看:强>
<div class="dropdown">
<button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">Menu<span class="caret"></span></button>
<ul class="dropdown-menu">
<?php if($has_children){ ?>
<li class="dropdown-submenu">
<a class="test" href="#"><?php echo $menu[0]['name']?> <span class="caret"></span></a>
<ul class="dropdown-menu">
<?php printMenu($menu); ?>
</ul>
</li>
<?php } else {?>
<li><a tabindex="-1" href="#"><?php echo $menu[0]['name']?></a></li>
<?php } ?>
</ul>
</div>
<强> CONTROLLER 强>:
public function index()
{
$this->load->helper('menu'); // OUR NEW HELPER FILE
$this->load->model('Test_model');
$data['menu'] = $this->Test_model->getCategoriesByParentId(0);
$data['has_children'] = 1; //REPLACE WITH A QUERY OR FUNCTION TO CHECK IF CHILDREN EXISTS IN YOU MENU
$this->load->view('dropdown', $data);
}
上面的示例仅适用于具有一个父级的数组。如果您需要多个父母,则必须为每个父母调用该函数。这不是最佳的,如果您需要在Codeigniter中对多个深度的菜单进行更高级的处理,您可以检查此项目中的库:https://github.com/edomaru/codeigniter_multilevel_menu
图书馆暂时没有更新,我不知道它是否与CI 3兼容,但也许您可以通过检查源代码获得一些如何进行的想法。他们甚至在那里有一个Bootstrap 3示例。