php实现无限极分类

最近在负责报表自动化管理的小功能,想从工作内容中整理点东西形成博客。但是过程中发现,这功能并没有代码实现上的难点。基本上值得说的地方,也就定时任务的合理设计,而定时任务之前有相关的博文。再有就是,开发思路和数据库合理的设计。这部分也不好形成文章。
但是好久没有写博客,希望能坚持下来。想起之前写过几个递归,干脆就整理一篇简单的无限极分类。
无限极分类,其实也就是一个递归算法。合理的利用递归确实能节省不少时间,但是对递归理解不够,最后坑的还是自己。
本文以一个简单的商品分类,来实现一个无限极分类。

创建数据表

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;

    }

记住一点,递归中一定要有判断。不然会无限循环下去,直到服务器崩溃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值