不败君

前端萌新&初级后端攻城狮

TP 或者 Laravel 框架实现无限级分类

TP 或者 Laravel 框架实现无限级分类

2019-10-08 18:12:51

围观(2293)

实际项目经常会遇到需要无限极分类,下面是 DEMO ,根据实际需求稍微改改就能用。

将下面代码写入控制器中:

public function get_all_data()
{
    //TP框架查询所有数据:
    //$data = (new UserModel)->select();
    //Laravel 框架查询所有数据:
    $data = (new UserModel)->get();
    $res = $this->sort_data($data);
    dump($res);
}

public function sort_data($data, $pid = 0, $root = 1)
{
    static $new_data = [];
    //循环遍历传递过来的数据
    foreach ($data as $key => $value) {
        //判断数据的上级 ID 是否等于当前 ID,最顶级 ID 为 0
        //这里的上级 ID 在数据库中的字段为 parent_id
        if ($value['parent_id'] == $pid) {
            $new_data[] = $value;
            $value['root'] = $root;
            //使用当前数据记录的 ID 进行再次循环排序
            $this->sort_data($data, $value['id'], $root + 1);
        }
    }
    return $new_data;
}

注意:此方法是递归方法实现,数据量太大可能会造成崩溃。


以上方法只是进行了排序,并不会对数组结构进行改变。有时候还会需要对数据进行修改结构。比如使用 Layui 的树形组件,就会有这样的数据格式要求:

[{
    title: '一级菜单',
    children: [{
      title: '二级菜单',
      children: [{
        title: '三级菜单'
        //……
        //以此类推, 无限层级
      }]
}]

那就可以调用下面这个方法:

public function sort_data($data, $pk = 'id', $pid = 'pid', $child = 'children', $root = 0)
{
    // 创建Tree
    $tree = [];
    if (!is_array($data)) {
        return false;
    }

    //创建基于主键的数组引用
    $refer = [];
    foreach ($data as $key => $value_data) {
        $refer[$value_data[$pk]] = &$data[$key];
    }
    foreach ($data as $key => $value_data) {
        // 判断是否存在parent
        $parentId = $value_data[$pid];
        if ($root == $parentId) {
            $tree[] = &$data[$key];
        } else {
            if (isset($refer[$parentId])) {
                $parent = &$refer[$parentId];
                $parent[$child][] = &$data[$key];
            }
        }
    }

    return $tree;
}

此时会发现数据还是稍微有点乱的,因为数据库字段挺多的。但是像 Layui 这样的组件,只需要用到 title 字段。

可以在 get_all_data 函数里使用循环遍历并使用 unset 函数去掉没用的字段。

public function get_all_data()
{
    //TP 框架查询所有数据:
    //$data = (new UserModel)->select();
    //Laravel 框架查询所有数据:
    $data = (new UserModel)->get();

    foreach ($data as $key => $value) {
        unset($data[$key]['content']);
        unset($data[$key]['list']);
        //... 以此类推
    }

    $res = $this->sort_data($data);
    dump($res);
}

如果你的字段实在太多,还可以这样保留只需要的字段:

public function get_all_data()
{
    //TP框架查询所有数据:
    //$data = (new UserModel)->select();
    //Laravel 框架查询所有数据:
    $data = (new UserModel)->get();

    $new_data = [];
    foreach ($data as $key => $value) {
        $new_data[$key]['id'] = $value['id'];
        $new_data[$key]['pid'] = $value['pid'];
        $new_data[$key]['title'] = $value['title'];

        //... 以此类推
        //此方法一定要将 id 和 pid 也存入新数组,否则无法实现无限级。
    }

    $res = $this->sort_data($data);
    dump($res);
}

最后可以得到很简约的 json 字串。

本文地址 : bubaijun.com/page.php?id=140

版权声明 : 未经允许禁止转载!

评论:我要评论

hsiangsun 沙发

简直就是教科书式的代码啊!

评论时间:2020-07-16 11:13:46

回复

不败君 板凳

@hsiangsun 夸张了😂

评论时间:2020-07-16 12:05:11

回复

发布评论:
Copyright © 不败君 粤ICP备18102917号-1

不败君

首 页 作 品 微 语