> 无限级分类查询有很多方式。本文记录的方式是先将所有数据查出来,再使用递归对数据进行排序,并附加层级字段(level)。此方式仅仅对无限级的数据进行排序,并没有将子级内容放入父级。 #### 1. 先看效果图 ---  #### 2. 在 TP6.0 中使用的 `对无限级分类进行排序,并附加层级字段` --- ```php <?php namespace app\admin\controller; use app\BaseController; use app\admin\model\Category as CategoryModel; class Category extends BaseController { /** * /category/getCateXmTree */ public function getCateXmTree() { $data = CategoryModel::field('id,pid,name') ->order('sort desc') ->select(); $data = $this->_sort($data);//对无限级分类重新排序 dump($data); } /** * 无限级分类递归排序 */ private function _sort($data, $pid = 0, $level = 0) { static $arr; foreach ($data as $v) { if ($v['pid'] == $pid) { $v->level = $level; $arr[] = $v->toArray(); $this->_sort($data, $v->id, $level + 1); } } return $arr; } } ``` #### 3. 其他写法 --- ```php /** * 无限级分类排序 */ private function getTree($array, $pid = 0, $level = 0) { // 声明静态数组,避免递归调用时,多次声明导致数组覆盖 static $list = []; foreach ($array as $key => $value) { //第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点 if ($value['pid'] == $pid) { //父节点为根节点的节点,级别为0,也就是第一级 $value['level'] = $level; //把数组放到list中 $list[] = $value; //把这个节点从数组中移除,减少后续递归消耗 unset($array[$key]); //开始递归,查找父ID为该节点ID的节点,级别则为原级别+1 $this->getTree($array, $value['id'], $level+1); } } return $list; } ```