php實現無限分類
阿新 • • 發佈:2019-02-19
/**
*@access public
* @param $pid 節點的id
* @param array 返回該節點的所有後代節點
*/
public function list_cate($pid = 0){
#獲取所有記錄
$query = $this->db->get(self::TBL_CATE);
$cates = $query->result_array();
#對類別進行重組
return $this->_tree($cates,$pid);
}
/**
*@access private
*@param $arr array 要遍歷的陣列
*@param $pid 節點的pid,預設為0,表示從頂級節點開始
*@param $level int 表示層級 預設為0
*@param array 排好序的所有後代節點
*/
privete function _tree($arr,$pid = 0,$level = 0){
static $tree = array(); #用於儲存重組的結果,注意使用靜態變數
foreach($arr as $v){
if($v['parent_id'] == $pid){
#說明找到了以pid為父節點的子節點,將其儲存
$v['level'] = $level;
$tree[] = $v;
#然後以當前節點為父節點,繼續找後代節點
$this ->_tree($arr,$v['cat_id'],$level+1);
}
}
return $tree;
}
#獲取某節點下面的直接子分類
public function child($arr,$pid = 0){
$child = array();
foreach($arr as $k => $v){
if($v['parent_id'] == $pid){
$child[] = $v;
}
}
return $child;
}
public function cate_list($arr,$pid = 0){
#獲取頂級分類,也就是parent_id的類別
$child = $this->child($str,$pid);
#如果為空,則返回null
if(empty($child)){
return null;
}
#如果不為空,則按照非方法繼續找其子節點
foreach($child as $k => $v){
$current_child = $this->cate_list($arr,$v['cat_id']);
if($current_child != null){
#說明,該分類節點還有子分類節點,則將子節點作為該節點的一個元素來儲存
$child[$k]['child'] = $current_child;
}
}
return $child;
}