Thinkphp的list_to_tree 實現無限級分類列出所有節點

list_to_tree 使用起來十分方便,詳細可查看手冊。因為我在用的時候需要同時列出所有節點,所以寫瞭一個遞歸函數,拿出來供大傢參考。

public function index(){
    Load('extend');            //加載擴展方法
    $Category=D('Category');
    $list=$Category->order('sort desc')->select();//實現同級節點排序
    $list=list_to_tree($list,'id','fid'); //詳細參數見手冊
    $list=$this->findChild($list);    
    dump($list);
}
protected  function findChild($arr){
        static $tree=array();
        foreach ($arr as $key=>$val){
                $tree[]=$val;
                if (isset($val['_child'])){
                    $this->findChild($val['_child']);
                }        
            }
    return $tree;
}

/**
 * 把返回的數據集轉換成Tree
 * @access public
 * @param array $list 要轉換的數據集
 * @param string $pid parent標記字段
 * @param string $level level標記字段
 * @return array
 */
function list_to_tree($list, $pk='id',$pid = 'pid',$child = '_child',$root=0) {
    // 創建Tree
    $tree = array();
    if(is_array($list)) {
        // 創建基於主鍵的數組引用
        $refer = array();
        foreach ($list as $key => $data) {
            $refer[$data[$pk]] =& $list[$key];
        }
        foreach ($list as $key => $data) {
            // 判斷是否存在parent
            $parentId = $data[$pid];
            if ($root == $parentId) {
                $tree[] =& $list[$key];
            }else{
                if (isset($refer[$parentId])) {
                    $parent =& $refer[$parentId];
                    $parent[$child][] =& $list[$key];
                }
            }
        }
    }
    return $tree;
}

/**
 * 對查詢結果集進行排序
 * @access public
 * @param array $list 查詢結果
 * @param string $field 排序的字段名
 * @param array $sortby 排序類型
 * asc正向排序 desc逆向排序 nat自然排序
 * @return array
 */
function list_sort_by($list,$field, $sortby='asc') {
   if(is_array($list)){
       $refer = $resultSet = array();
       foreach ($list as $i => $data)
           $refer[$i] = &$data[$field];
       switch ($sortby) {
           case 'asc': // 正向排序
                asort($refer);
                break;
           case 'desc':// 逆向排序
                arsort($refer);
                break;
           case 'nat': // 自然排序
                natcasesort($refer);
                break;
       }
       foreach ( $refer as $key=> $val)
           $resultSet[] = &$list[$key];
       return $resultSet;
   }
   return false;
}

/**
 * 在數據列表中搜索
 * @access public
 * @param array $list 數據列表
 * @param mixed $condition 查詢條件
 * 支持 array('name'=>$value) 或者 name=$value
 * @return array
 */
function list_search($list,$condition) {
    if(is_string($condition))
        parse_str($condition,$condition);
    // 返回的結果集合
    $resultSet = array();
    foreach ($list as $key=>$data){
        $find   =   false;
        foreach ($condition as $field=>$value){
            if(isset($data[$field])) {
                if(0 === strpos($value,'/')) {
                    $find   =   preg_match($value,$data[$field]);
                }elseif($data[$field]==$value){
                    $find = true;
                }
            }
        }
        if($find)
            $resultSet[]     =   &$list[$key];
    }
    return $resultSet;
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *