php批量删除
批量删除是一个很常见的功能,尤其是对于那种有无限级分类的,比如常用的批量删除栏目,在删除父级栏目的时候还需要删除这个栏目下的子栏目。
今天耐不住寂寞搞了一把,基本上自己想要实现的效果实现了,先来看一下页面吧
点击全选之后的效果:
在这里有一个小技巧:复选框的name,value值的设置,我在这里将name,value分别设置为name=item[],value=栏目对应的id,这样提交过去之后可以直接通过循环根据栏目的id进行删除
代码如下:
<td align="center"> <label> <input type="checkbox" class="inverted" name="item[]" value="{$vo.id}"> <span class="text"></span> </label> </td>
后台处理方法:
// 栏目排序&批量删除 public function bdel_sort() { if(request()->isPost()) { $data = input('post.'); if(isset($data['item'])) { //栏目批量删除 foreach ($data['item'] as $k=>$v) { $childrenidsarr[] = model('cate')->delCatetrees($v); $childrenidsarr[] = (int)$v; } // 将数组中重复的去掉 ,1.将二维数组变成一维数组 $_childrenidsarr = array(); foreach ($childrenidsarr as $k=>$v) { if(is_array($v)) { foreach ($v as $kk=>$vv) { $_childrenidsarr[] = $vv; } }else { $_childrenidsarr[] = $v; } } // 2.去除重复的元素 $_childrenidsarrs= array_unique($_childrenidsarr); $del = db('cate')->delete($_childrenidsarrs); if($del) { $this->success('批量删除栏目成功',url('lists')); }else { $this->error('批量删除栏目失败'); } }else { // 栏目排序 foreach ($data['sorts'] as $k=>$v) { db('cate')->where('id',$k)->update(['sorts'=>$v]); } $this->success('栏目排序成功',url('lists')); } return; } }还有一个重要的步骤就是如何去查找单个栏目的子栏目,这里需要需要使用递归的方法:
列入单个删除某一个栏目的时候我们把这个栏目的id传入进去,代码如下(在这里我把查找子栏目的方法放在了模型了,对于比较复杂的数据处理放在模型里面比较方便):
model('cate')->delCatetrees($cateid);
// 删除无限级栏目 public function delCatetrees($cateid) { $data = $this->select(); return $this->delcateChildren($data,$cateid); } public function delcateChildren($data,$cateid) { static $arr = array(); foreach ($data as $k=>$v) { if($cateid == $v['pid']) { $arr[] = $v['id']; $this->delcateChildren($data,$v['id']); } } return $arr; }
还有一点值的注意的时候当返回的时候别忘了把当前删除的栏目id也放到返回的数组里面,因为前面只是找到了关于这个栏目的子栏目。
截图是另一个比较重要的步骤,我把返回的所有的栏目id以及子栏目的id全部放到了一个数组中,但是发现会出现重复,这个是不可避免的,所以在下面写了一个内部嵌套的循环方法,先把返回的二维数组变成一维数组,然后在使用array_unique()函数去掉重复的元素,此时我们所得到的元素就是需要删除的栏目id以及他下面的子栏目的id
直接实例化数据模型,使用delete方法实施删除操作就行了。