超級無限分類 使用簡單 效率極高 核心代碼10行不到
另外 求這個分類的不足,和更高效簡單的無限分類方法 ^_^
核心代碼如下
class Tool { static public $treeList = array(); //存放無限分類結果如果一頁面有多個無限分類可以使用 Tool::$treeList = array(); 清空 /** * 無限級分類 * @access public * @param Array $data //數據庫里獲取的結果集 * @param Int $pid * @param Int $count //第幾級分類 * @return Array $treeList */ static public function tree(&$data,$pid = 0,$count = 1) { foreach ($data as $key => $value){ if($value['Pid']==$pid){ $value['Count'] = $count; self::$treeList []=$value; unset($data[$key]); self::tree($data,$value['Id'],$count+1); } } return self::$treeList ; } }
$treeList[] 保存排序的結果 基本就是進行了一次排序 保存后就可以 unset($data[$key]); 掉 因為已經使用不到了
&$data 使用按地址傳參,結合unset($data[$key]); 減少循環次數,這樣效率提高了好幾倍,
但需要對 Pid進行 ASC的排序 不然會顯示不完全
$value['Count'] = $count; 為當前的等級 在模板里會通過等級進行生成樹形結構
排序前后的數據結構如下
表所需要字段 Id,Pid
排序前的數據結構
id pid
1 0
2 0
3 1
4 3
排序后的數據結構
id pid count
1 0 1
3 1 2
4 3 3
2 0 1
//默認列表 public function index() { $menu = M('Menu'); $list = $menu->order('Pid ASC,Morder DESC,Id ASC')->select(); $this->assign('List',Tool::tree($list)); $this->display(); }
控制器里調用
<td style="text-indent:<{$vo['Count']*20}>px;"><neq name="vo.Count" value="1">| -- </neq><{$vo.Name}></td>
模板使用里<volist> 正常輸出即可 把需要生成樹結構的字段 修改成如上
測試了 如果是3000條的話 用時 0.5秒 1000個的話 0.02秒的左右 超過3000效率就會大幅度降低 2000左右的效率還是比較高的 沒有進行更詳細的測試
如果哪位大哥測試了 麻煩把測試結果回復下哈
新聞熱點
疑難解答
圖片精選