> 無限級分類查詢有很多方式。本文記錄的方式是先將所有數據查出來,再使用遞歸對數據進行排序,并附加層級字段(level)。此方式僅僅對無限級的數據進行排序,并沒有將子級內容放入父級。 #### 1. 先看效果圖 --- ![](https://img.itqaq.com/art/content/0a9902103b8f6c9790f28c62fa09f664.png) #### 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) { // 聲明靜態(tài)數組,避免遞歸調用時,多次聲明導致數組覆蓋 static $list = []; foreach ($array as $key => $value) { //第一次遍歷,找到父節(jié)點為根節(jié)點的節(jié)點 也就是pid=0的節(jié)點 if ($value['pid'] == $pid) { //父節(jié)點為根節(jié)點的節(jié)點,級別為0,也就是第一級 $value['level'] = $level; //把數組放到list中 $list[] = $value; //把這個節(jié)點從數組中移除,減少后續(xù)遞歸消耗 unset($array[$key]); //開始遞歸,查找父ID為該節(jié)點ID的節(jié)點,級別則為原級別+1 $this->getTree($array, $value['id'], $level+1); } } return $list; } ```