商品カテゴリの再帰的削除
商品カテゴリの再帰的削除
削除 以前にも実行しましたが、少し異なります。さらに複雑ですが、最上位の列を削除するときは、最上位の列の下にあるカテゴリも削除する必要があります。
#Cate コントローラー# public function del($id){
$cata=D('cate');
$childids=$cata->getchild($id);
$childids=implode(',',$childids);
if($cata->delete($childids)){
$this->success('删除栏目成功!',U('index'));
}else{
$this->error('删除栏目失败!');
}
}
#CateModel モデル レイヤー
public function getchild($cateid){ $data=$this->select(); return $this->getchildids($data,$cateid); } public function getchildids($data,$cateid){ static $res=array(); $res[]=$cateid; foreach ($data as $k => $v) { if ($v['pid']==$cateid) { $res[]=$v['id']; $this->getchildids($data,$v['id']); } } return array_unique($res); }階層的に説明しましょう$childids=$cata->getchild($id);getchild メソッドに id を渡します。
public function getchild($cateid){ $data=$this->select(); return $this->getchildids($data,$cateid); }ここの getchild メソッドは、渡された ID を受け取った後、すべてのカテゴリをクエリします。 getchildids メソッドにデータと ID を返します。
public function getchildids($data,$cateid){ static $res=array(); $res[]=$cateid; foreach ($data as $k => $v) { if ($v['pid']==$cateid) { $res[]=$v['id']; $this->getchildids($data,$v['id']); } } return array_unique($res); }
$res=array();配列を定義します。 $res[]=$cateid; 空の配列は ID の保存に使用されます。
foreach はデータを走査します。その PID が現在の ID と等しい場合、それが最上位であることを意味します。今回はIDを$に格納します。 res[]の空の配列で、再度再帰を使用します。
return array_unique($res); Eileen はこの配列を返し、array_unique は重複を削除します。
これは、最上位の列を削除すると、複数の列を削除したことがわかります。