codeigniter中父类别下的嵌套子类别

时间:2013-12-08 19:59:50

标签: php codeigniter

我想在表格中显示类别列表,在右下方显示每个父类别的子类别。

修改

我希望它看起来像这样:

  

第一类

     

- >子类别1#1

     

- >子类别一#2

     

第二类

     

- >子类别2#1

     

- >子类别2#2

     

第三类

     

- >子类别3#1

     

- >子类别3#2

但我得到的是:

  

第一类

     

第二类

     

第三类

     

- >子类别1#1

     

- >子类别一#2

     

- >子类别#1 ......等

以下是模型:

function get_categories() {
    $data = array();
    $this->db->group_by('parent_id,category_id');
    $query = $this->db->get('category');
    if ($query->num_rows() > 0) {
        foreach ($query->result() as $row) {
            $data[] = $row;
        }
    }
    return $data;
}

在控制器中,我用$data['categories']=$this->category_model->get_categories()调用此函数。我用以下代码在视图中显示数据:

<?php foreach ($categories as $cat) : ?>
   <tr>
      <td><?php echo $cat->name ?></td>
      <td><?php echo $cat->description ?></td>
   </tr>
<?php endforeach; ?>

但问题是,子类别显示在列表的底部,而不是在每个父类别下。请帮我解决这个问题。感谢。

3 个答案:

答案 0 :(得分:2)

因此,您正确检索所有类别,但它们无法正确显示。您的问题是您正在遍历所有类别,并且您没有正确地向父母输出相关的子类别。我不知道你的数据结构是什么样的,但你必须有一个可以检查的外键类型字段。

以下是一个如何运作的例子:

<?php foreach ($categories as $cat) : ?>
    <tr>
       <td><?php echo $cat->name ?></td>
       <td><?php echo $cat->description ?></td>
    </tr>
    <?php foreach($sub_categories as $sub_category) : ?>
        <?php 
        // if this sub_category doesn't belong to the current parent, skip it
        if($sub_category['parent_id'] != $cat['category_id'])
            continue; 
        ?>
        <tr>
            <td><?php echo $sub_category->name ?></td>
            <td><?php echo $sub_category->description ?></td>
        </tr>
    <?php endforeach; ?>
<?php endforeach; ?>

当然,更好的方法是以正确的结构获取数据,例如:嵌套数组Parent => array(parent_data, Children => array(children_data))

答案 1 :(得分:2)

您需要迭代您的类别并按父ID分组。据我所知,您的类别存储为Adjacency List,因此这个示例可能会有所帮助:

function get_categories(){
    $this->db->order_by('parent_id');
    return $this->db->get('category')->result_array();
}
$categories = get_categories();
$result = array();
foreach($categories as $cat){
    if($cat['parent_id'] && array_key_exists($cat['parent_id'], $result)){
        $result[$cat['parent_id']]['sub_categories'][] = $cat;
    }
    else{
        $result[$cat['id']] = $cat;
    }
}

第二步需要渲染html:

<?php foreach ($result as $cat):?>
    <tr>
         <td><?=$cat['name'];?></td>
         <td><?=$cat['description'];?></td>
    </tr>
    <?php if(isset($cat['sub_categories'])):?>
        <?php foreach($cat['sub_categories'] as $sub_category):?>
            <tr>
                <td><?=$sub_category['name'];?></td>
                <td><?=$sub_category['description'];?></td>
           </tr>
        <?php endforeach;?>
    <?php endif;?>
<?php endforeach;?>

Html输出与@scrowler回答非常相似。

答案 2 :(得分:0)

Database should like this

在模型中

//categories
public function getCategories()
{
    $query = $this->db->query('select * from categories where cat_parent=0');
    return $query->result_array();
}

public function getCategoriesSub($parent)
{
    $query = $this->db->query("select * from categories where cat_parent='$parent'");
    return $query->result_array();
}

在控制器中

public function categories()
{
    $data['mcats'] = $this->admin_model->getCategories();

    foreach($data['mcats'] as $key =>$val){
        $subcats = $this->admin_model->getCategoriesSub($val['cid']);
        if($subcats){
            $data['scats'][$val['cid']] = $subcats;
        }
    }


    $this->load->view('admin/header');
    $this->load->view('admin/category_list', $data);
    $this->load->view('admin/footer');

}

在视图中

<ul>
<?php 
foreach ($mcats as $key =>$val)
    {
?>
<li><?php echo $val['cat_name']; ?>
<ul>
<?php
    foreach ($scats[$val['cid']] as $sub)  {
        echo '<li>' . $sub['cat_name'] . '</li>';
    }
?>
</ul>
</li>
<?php
}
?>
</ul>

其工作代码。试试这个