thinkphp實現無限級分類


普通的方法(采用for和foreach)

		//顯示
        foreach($data as $k=>$v){
        //str_repeat()函數用於把字符串重復指定的次數
            $data[$k]['title']=str_repeat('---',$v['type']-1).$v['title'];
        }

無限級分類的設計思路:
為了能夠使得欄目的管理更加動態化,在這里可以設置添加欄目,添加的數據庫中設計一個名為pid的字段,便於新添加的欄目可以找到他的父欄目。如果是頂級的欄目,則pid為0。再提取數據顯示的時候,后台數據庫中設置有type字段,用於標識該欄目的等級,在數據顯示的時候用str_repeat()函數在前面加上‘-----’,來區分他們的等級。
這個時候的排序顯得非常的重要,並且此方法沒辦法很好的把父級和子級聯系在一起,不建議使用

排序

添加的時候為了更加方便的直觀的顯示哪個欄目下有什么子欄目,可以選擇在里面設置一個sorts排序字段,用於排序。在前端,為了能夠方便排序。需要表單提交全部的排序的內容。前端的話只需要在表單input的name屬性里加入一個數組名

<input type="hidden" name="id[]" value="{$arr.id}"/>
<input type="text" value="{$arr.sorts}" style="width: 40px;height: 40px;text-align: center" name="sorts[]"/>

然后后台進行接受,同樣用for和foreach進行循環操作和遍歷

		//把新的獲得的排序的信息儲存到數據庫中
        $arr=$_POST;
        for($i=0;$i<count($arr['id']);$i++){
            $sort=$model->find($arr['id'][$i]);
            $sort['sorts']=$arr['sorts'][$i];
            $model->save($sort);
        }
        //然后根據新的排序信息進行排序
        $data=$model->order('sorts')->select();
        foreach($data as $k=>$v){
            $data[$k]['title']=str_repeat('---',$v['type']-1).$v['title'];
        }


用遞歸的方法實現無限級分類


public function getCate($field='*'){
	//用field查詢固定字段的數據,若是沒有輸入實參,則默認查詢全部
	//獲取到數據庫中相關欄目的數據
	$data=$this->field($field)->order('sorts asc')->select();
	//調用遞歸函數
	return $this->getTree($data);
}

//根據父級欄目的id去查詢子欄目的信息
//遞歸函數,傳入全部的欄目信息,用pid來標識欄目所對應的父級的欄目id,level來表示欄目的等級
public function getTree($data,$pid=0,$level=0){
	//此處應該定義static 如果沒有用static,則無法輸出全部的欄目信息
	static $tree=array();
	foreach($data as $key=>$v){
		if($v['pid']==$pid){
			$v['level']=$level;
			//str_repeat()函數用於把字符串重復指定的次數,用於區別欄目的等級
			$v['title']=str_repeat('----',$level).$v['title'];
			$tree[]=$v;
			$this->getTree($data,$v['id'],$level+1);
		}
	}
}

在用遞歸函數進行無限級分類的時候建議寫在model函數里,這樣在控制器中只需要調用模型中的方法即可。再模型中要想調用數據庫的查詢操作,不用加表明,只需要在模型中使用$this即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM