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