thinkphp无限分类原理和实现代码
递归无限级分类的原理:
每一个分类都记录它的父级id,当为顶级分类时,父级id为0。这样无论哪个分类,都可以通过父级id一层一层去查明它的所有父级,以便清楚知道它所属何种分类,层级深度为几。
对数据进行重组,在重组的过程中,根据其父子关系,将相应的类别摆放到正确的位置。/*无限极分类列表*/
public function getTree($data='',$cate_id=0)
{
if(empty($data)){
$data = $this->order('listorder')->field('id,parent_id,cate_name,listorder')->select()->toArray();
}
return $this->_reSort($data,$cate_id);
}
//无限极分类树状结构,修改level值
/* @param $data 要遍历的分类数组
* @param $parent_id 节点pid,默认为0,表示从顶级节点开始
* @param $ret重组排序的所有后代节点
* @param $cate_level 节点层级
*/
private function _reSort($data, $parent_id=0, $cate_level=0, $isClear=TRUE)
{
//用于保存重组排序后的结果
static $ret = array();
//刚进入函数要清除上次调用此函数后留下的静态变量的值,进入深一层循环时则不要清除
if($isClear)
$ret = array();
foreach ($data as $k => $v)
{
if($v['parent_id'] == $parent_id)
{
$v['cate_level'] = $cate_level;
//找到以$parent_id为父节点的子节点,将其保存
$ret[] = $v;
unset($data[$k]);
//然后以该节点为父节点,继续找后台节点
$this->_reSort($data, $v['id'], $cate_level+1, FALSE);
}
}
return $ret;
}
调用class Category extends Base
{
public function index()
{
$category_model = new Categorys();
$categoryTree = $category_model->getTree();
return view('',[
'categoryTree' =>$categoryTree,
'left_menu' => 1,
]);
}
}