我想在表格中显示类别列表,在右下方显示每个父类别的子类别。
修改
我希望它看起来像这样:
第一类
- >子类别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; ?>
但问题是,子类别显示在列表的底部,而不是在每个父类别下。请帮我解决这个问题。感谢。
答案 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)
在模型中
//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>
其工作代码。试试这个