无限分类如何理解

我在另一篇帖子 博客:Laravel 框架实现无限极分类 看到了个大家推荐的方法,但是由于我个人的水平有限希望来个大神帮我注释一下每一行代码都是什么意思谢谢

/**
     * 一维数据数组生成数据树
     * @param array $list 数据列表
     * @param string $id 父ID Key
     * @param string $pid ID Key
     * @param string $son 定义子数据Key
     * @return Collection
     */
    public static function arr2tree($list, $id = 'id', $pid = 'pid', $son = 'sub')
    {
        list($tree, $map) = [[], []];
        foreach ($list as $item) {
            $map[$item[$id]] = $item;
        }

        foreach ($list as $item) {
            if (isset($item[$pid]) && isset($map[$item[$pid]])) {
                $map[$item[$pid]][$son][] = &$map[$item[$id]];
            } else {
                $tree[] = &$map[$item[$id]];
            }
        }
        unset($map);
        return $tree;
    }

    /**
     * 一维数据数组生成数据树
     * @param array $list 数据列表
     * @param string $id ID Key
     * @param string $pid 父ID Key
     * @param string $path
     * @param string $ppath
     * @return array
     */
    public static function arr2table(array $list, $id = 'id', $pid = 'pid', $path = 'path', $ppath = '')
    {
        $tree = [];
        foreach (self::arr2tree($list, $id, $pid) as $attr) {
            $attr[$path] = "{$ppath}-{$attr[$id]}";
            $attr['sub'] = isset($attr['sub']) ? $attr['sub'] : [];
            $attr['spt'] = substr_count($ppath, '-');
            $attr['spl'] = str_repeat(" ├ ", $attr['spt']);
            $sub         = $attr['sub'];
            unset($attr['sub']);
            $tree[] = $attr;
            if (!empty($sub)) {
                $tree = array_merge($tree, self::arr2table($sub, $id, $pid, $path, $attr[$path]));
            }
        }
        return $tree;
    }
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5
Epona

其实就是一个树状结构, 可以先看一下基础的 Binary Tree, 然后就能够理解了。

2年前 评论

先自己尝试明白每一行的代码,再问具体哪一行代码不明白。

因为有些是基础的函数调用,不可能也写上去吧?

2年前 评论

正常无限极一般用递归实现的,便于理解 他这种方法是用到了引用实现递归,逻辑理解上有点执拗,理解引用有助于你理解这些代码.

2年前 评论

以下是个人理解,如果有不对的地方请大家指正, 无限分类其实就是子子孙孙无穷尽(我们的数据其实都是有限的), 但是要把一群人列出来谁是子谁是孙,正常情况下我们说的是父子关系,类似族谱

   // $list 数组必须要有相同的属性'id'和'pid'
    public static function arr2tree($list, $id = 'id', $pid = 'pid', $son = 'sub')
    {
        list($tree, $map) = [[], []]; //定义两个空数组
        //以下循环 把传来的数组$list,按自己的身份id重新放进定义好的一个空数组$map
        foreach ($list as $item) {
            $map[$item[$id]] = $item;//该id值可能是父级值,可能是子级值
        }
       //以下循环 把数组$list里的元素判断一下父子关系,
        foreach ($list as $item) {
            if (isset($item[$pid]) && isset($map[$item[$pid]])) {//判断该元素有父级,且父级已被定义过
                $map[$item[$pid]][$son][] = &$map[$item[$id]];//把该元素放到父级的子级里
            } else {//如果没有父级属性或者父级没有被定义过
                $tree[] = &$map[$item[$id]];//, 那么该元素就是他这个派系的第一代父级
            }
        }
        unset($map);
        return $tree;
    }

举一个数组例子
$arr=[
['id'=>1,'pid'=>0],
['id'=>2,'pid'=>1]
['id'=>3]
];
$arr2=$this->arr2tree($arr);
return $arr2;

file

arr2table() 这个方法不太懂用意
2年前 评论

作为开发,希望别人给你来解释每一行,过分了吧,不自己去调试下,怎么会有进步

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!