普通的方法(采用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即可。
