php实现无限级分类数据渲染
下面试一个大概样式,可以无限级分下去;大家可以根据自己的需求编写样式,原理都是一样的
先把想要的样式写出来调试好,进行注释,方便后面php直接渲染数据结构
<!-- <div class="sub_item">
<div class="sub_title">
<a href="">顶级分类1</a>
<span class="icon_box close">
<img src="__CDN__/mobile/img/home/h34.png" class="icon_tri" title="下拉" title="下拉">
</span>
</div>
<div class="sub_item">
<div class="sub_title">
<a href="">二级分类1</a>
<span class="icon_box">
<img src="__CDN__/mobile/img/home/h34.png" class="icon_tri" title="下拉" title="下拉">
</span>
</div>
<div class="sub_item">
<div class="sub_title">
<a href="">三级分类1</a>
</div>
</div>
</div>
<div class="sub_item">
<div class="sub_title">
<a href="">二级分类2</a>
</div>
</div>
</div>
<div class="sub_item">
<div class="sub_title">
<a href="">顶级分类2</a>
<span class="icon_box">
<img src="__CDN__/mobile/img/home/h34.png" class="icon_tri" title="下拉" title="下拉">
</span>
</div>
</div> -->
然后获取所有分类数据数组,进行重构
//产品分类
$pclass=Db::name('class')->select();//所有数据
$items = array();
foreach($pclass as $v){//构建一个新数组,新数组的key是自己的主键id
$items[$v['id']] = $v;
}
$tree = array();
foreach($items as $k => $item){//将已经重构的数组遍历,并判断当前数组元素的父级分类是否存在
if(isset($items[$item['pid']])){
$items[$item['pid']]['son'][] = &$items[$k];
}else{
$tree[] = &$items[$k];
}
}
$mclassstr=$this->loopm($tree,0,'url/xxxx/xxx');//第三个参数,指点击分类跳转的页面链接
$this->assign('mclassstr',$mclassstr);
接下来将前面写好的分类结构进行循环渲染
public function loopm($class,$level,$url){
$str='';
if($level==0){
foreach($class as $item){
$str.='<div class="sub_item"><div class="sub_title"><a href="'.$url.$item['id'].'.html" target="_blank">'.$item['cname'].'</a>';
if(isset($item['son']) && $item['son']){
$str.='<span class="icon_box"><img class="icon_tri" src="/mobile/img/home/h34.png" alt=""></span>';
}
$str.='</div>';
if(isset($item['son']) && $item['son']){
$str.=$this->loopm($item['son'],$level+1,$url);
}
$str.="</div>";
}
}
else if($level==1){
foreach($class as $item){
$str.='<div class="sub_item">';
$str.='<div class="sub_title"><a href=">'.$url.$item['id'].'.html" target="_blank">'.$item['cname'].'</a>';
if(isset($item['son']) && $item['son']){
$str.='<span class="icon_box"><img class="icon_tri" src="/mobile/img/home/h34.png" alt=""></span></div>';
$str.=$this->loopm($item['son'],$level+1,$url);
}else{
$str.="</div>";
}
$str.='<div>';
}
}
else{
$kongge='';
for($i=0;$i<$level;$i++){
$kongge.=' ';
}
foreach($class as $item){
$str.='<div class="sub_item">';
$str.='<div class="sub_title"><a href="'.$url.$item['id'].'.html" target="_blank">'.$item['cname'].'</a>';
if(isset($item['son']) && $item['son']){
$str.='<span class="icon_box"><img class="icon_tri" src="/mobile/img/home/h34.png" alt=""></span></div>';
$str.=$this->loopm($item['son'],$level+1,$url);
}else{
$str.="</div>";
}
$str.='</div>';
}
}
return $str;
}
最后在html页面需要渲染数据的地方,进行渲染
<div>
{$mclassstr}
</div>