首先建立數據庫:php
CREATE DATABASE IF NOT EXISTS `fenlei` DEFAULT character SET utf8 COLLATE utf8_general_ci; USE `fenlei`; CREATE TABLE IF NOT EXISTS `category` ( `catid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵', `upid` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '上級分類catid', `catname` varchar(255) NOT NULL DEFAULT '' COMMENT '分類名稱', `displayorder` tinyint(1) NOT NULL DEFAULT '0' COMMENT '顯示順序', `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0-關閉,1-啓用', PRIMARY KEY (`catid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='文章分類'; INSERT INTO `category` VALUES ('1', '0', '分類1', '0', '1'), ('2', '0', '分類2', '0', '1'), ('3', '0', '分類3', '0', '1'), ('4', '0', '分類4', '0', '1'), ('5', '0', '分類5', '0', '1'), ('6', '1', '分類1-1', '0', '1'), ('7', '1', '分類1-2', '0', '1'), ('8', '1', '分類1-3', '0', '1'), ('9', '1', '分類1-4', '0', '1'), ('10', '1', '分類1-5', '0', '1'), ('11', '6', '分類1-1-1', '0', '1'), ('12', '6', '分類1-1-2', '0', '1'), ('13', '6', '分類1-1-3', '0', '1'), ('14', '7', '分類1-2-1', '0', '1'), ('15', '7', '分類1-2-2', '0', '1'), ('16', '11', '分類1-1-1-1', '0', '1'), ('17', '11', '分類1-1-1-2', '0', '1');
modelhtml
<?php /* * 這是一個成熟的模型,放入相應文件夾直接調用便可 */ namespace app\index\model; class Category extends \think\Model { /* * 打開冰箱:從數據庫取出全部數據,並放進緩存內 * 便可獨立輸出也能夠在其餘位置調用 */ public function category_query($catid=0) { cache('category',null);//正式環境刪除本行可減小一次查詢 if(!$result = cache('category')){ $Category = new Category(); $result = []; foreach($Category->order('displayorder asc,catid asc')->select() as $data){ $result[$data['catid']] = $data; } cache('category',$result,0); } return $catid ? $result[$catid] : $result;//若是傳入單個分類catid,那麼直接返回就行,可用於列表頁,大大下降查詢次數 } /* * 把大象放進冰箱:將第一步獲得的數據集轉化爲無限級數組 * 便可獨立輸出也能夠在其餘位置調用 */ public function category_tree($upid=0,$status='0,1'){ $status = is_string($status) ? explode(',', $status) : $status; $result = []; foreach($this->category_query() as $catid=>$cat){ if($upid == $cat['upid'] && in_array($cat['status'],$status)){ $cat['subcat'] = $this->category_tree($cat['catid'],$status); $result[] = $cat; } } return $result; } /* * 關上冰箱門:用於實際用途,將多級數據傳入,轉化爲前端html代碼 * 該html的轉化結果可從第一步中獲取方式不一樣來實現從哪一級開始展現 * 本函數只是師範函數,實際運用中只須要修改這個函數結構體就能徹底實現仿網易蓋樓效果 */ public function category_html($categorys,$depth=0){ $depth_html = $html = ''; for ($i=0; $i < $depth; $i++) { $depth_html .= '——'; } foreach($categorys as $data){ $html .= '<tr>'; $html .= '<td class="center">'.$data['catid'].'</td class="center">'; $html .= '<td class="center">'.$data['displayorder'].'</td>'; $html .= '<td>'.$depth_html.$data['catname'].'</td>'; $html .= '</tr>'; if($data['subcat']){ $html .= $this->category_html($data['subcat'],$depth+1); } } return $html; } } ?>
首先經過category_query方法獲取到全部分類,前端
而後經過category_tree方法將獲得的數據轉化爲無限分類數組數據庫
最後再經過category_html方法將上面獲得的無限分類數組輸出爲html數組
控制器Controller緩存
<?php namespace app\index\controller; use think\Controller; use app\index\model\Category;//引入模型類 class Index extends Controller { public function index() { $Category = new Category;//實例化類 $category_tree = $Category->category_tree();// 獲取總體多級數組樹結果 $this->view->category_list = $Category->category_html($category_tree);//將結果轉化爲實體html並傳值給模板 return $this->fetch(); } }
來調用輸出數據,最終結果以下:app