最近在负责报表自动化管理的小功能,想从工作内容中整理点东西形成博客。但是过程中发现,这功能并没有代码实现上的难点。基本上值得说的地方,也就定时任务的合理设计,而定时任务之前有相关的博文。再有就是,开发思路和数据库合理的设计。这部分也不好形成文章。
但是好久没有写博客,希望能坚持下来。想起之前写过几个递归,干脆就整理一篇简单的无限极分类。
无限极分类,其实也就是一个递归算法。合理的利用递归确实能节省不少时间,但是对递归理解不够,最后坑的还是自己。
本文以一个简单的商品分类,来实现一个无限极分类。
创建数据表
CREATE TABLE shop (
id int not null auto_increment,
shop_name varchar(128) not null DEFAULT '',
parent_id int not null default 0,
PRIMARY KEY (id)
)
表结构也比较简单,这里不详细说明。parent_id即用来标识当前记录所属分类。
在递归中查询
public function shop_list($data,&$list){
foreach ($data as $key => $value) {
$model = Shop::find()->where(['parent_id'=>$value['id']])->asArray()->all();
$list[] = $value;
if ($model) {
$this->shop_list($model,$list);
}
}
return $list;
}
实现逻辑是这样的,先查询出顶层数据。再通过递归的方式,逐级查询数据。
方法的第二个参数,使用了引用。
使用数组递归
为了避免递归中不停查询数据,造成数据了压力。可以先把所有数据查询出来之后,通过数组去做递归。同样也能完成无限极分类。
public function loop_arr($data,$pid=0){
$list = array();
foreach ($data as $key => $value) {
if ($value['parent_id']==$pid) {
$list[] = $value;
$list = array_merge($list,$this->loop_arr($data,$value['id']));
}
}
return $list;
}
记住一点,递归中一定要有判断。不然会无限循环下去,直到服务器崩溃。