无限级分类

作者: Theflash_26d0 | 来源:发表于2018-05-25 22:32 被阅读0次

1.有两种实现方式:a.递归方式,b.迭代方式;

a.递归方式:(实现家谱树和子孙树)

家谱树:

    /**

    * 获取父类树

    * @param  array  $data        待分类的数据

    * @param  int    $parent_id  要找的祖先节点

    * @param  int    $level      指定第一层级的初始level键的值,默认为 0,每递归一轮该level值自增 1 以体现层次

    * @return array

    */

    public function getAncestry($data, $parent_id = 0, $level = 0)

    {

        static $ancestry = array();

        if(empty($data) || !is_array($data)){

            return [];

        }

        foreach ($data as $key => $value) {

            if ($value['id'] === $parent_id) {

                $ancestry[] = $value;

                $value['level'] = $level;

                $this->getAncestry($data, $value['parent_id'], $level+1);

            }

        }

        return $ancestry;

    }

子孙树:

/**

    * 获取子孙树

    * @param   array $data   待分类的数据

    * @param   int /string   $id  要找的子节点id

    * @param   int $level    指定第一层级的初始level键的值,默认为 0,每递归一轮该level值自增 1 以体现层次

    * @return  array

    */

    function getSubTree($data, $id = 0, $level = 0)

    {

        static $son = array();

        if (empty($data) || !is_array($data)) {

            return [];

        }

        foreach ($data as $key => $value) {

            if ($value['parent_id'] == $id) {

                $value['level'] = $level;

                $son[] = $value;

                //$value['child']=$this->getSubTree($data,$value['id'],$level+1);//展示层级关系

                $this->getSubTree($data, $value['id'], $level+1);

            }

        }

        return $son;

    }

b.迭代方式:(实现家谱树和子孙树)

家谱树:

/**

    * 获取父类树

    * @param  $data           待分类的数据

    * @param  int $parent_id  要找的祖先节点

    * @return array

    */

    function getAncestry1($data, $parent_id = 0) {

        $ancestry = array();

        if (empty($data) || !is_array($data)) {

            return [];

        }

        while($parent_id > 0) {

            foreach($data as $value) {

                if($value['id'] == $parent_id) {

                    $ancestry[] = $value;

                    $parent_id = $value['parent_id'];

                }

            }

        }

        return $ancestry;

    }

子孙树:

/**

    * 获取子孙树

    * @param $data       待分类的数据

    * @param int $id     $id  要找的子节点id

    * @return array

    */

    function getSubTree1($data, $id = 0) {

        $task = array($id);                         //栈 任务表

        $child = array();

        while(!empty($task)) {

            $flag = false;                          //是否找到节点标志

            foreach($data as $key => $value) {

                //判断是否是子孙节点的条件 与 递归方式一致

                if($value['parent_id'] == $id) {

                    $child[] = $value;                     //节点存入数组

                    array_push($task , $value['id']);    //节点id入栈

                    $id = $value['id'];                  //判断条件切换

                    unset($data[$key]);                 //删除节点

                    $flag = true;                       //找到节点标志

                }

            }

            //flag == false说明已经到了叶子节点 无子孙节点了

            if($flag == false) {

                array_pop($task);                   // 出栈

                $id = end($task);                   //寻找栈顶id的子节点

            }

        }

        return $child;

    }

相关文章

  • 无限级分类

    1.有两种实现方式:a.递归方式,b.迭代方式; a.递归方式:(实现家谱树和子孙树) 家谱树: /** ...

  • 2018-12-10

    复习无限级分类

  • 预排序遍历树

    什么是左右值无限级分类左右值无限级分类,也称为预排序树无限级分类,是一种有序的树状结构,位于这些树状结构中的每一个...

  • 2018 10 16

    学习商城的无限级分类

  • PHP无限级分类

    layout: posttitle: "PHP无限级分类"date: 2016-04-29 09:36:19 +0...

  • laravel无限级分类

    用laravel 做无限极分类;找了很多资料;假大空;有很多都是残缺的;而且达不到预期;无法做到无限极;今天分享下...

  • golang 无限级分类

    分类结构 分类列表如下 递归实现

  • PHP无限级分类(一)

    无限级分类在web项目中应用非常广泛,比如商品分类、权限节点、组织架构等等。下面介绍两种将二维数组整理成无限级树形...

  • PHP无限级分类(二)

    在 PHP无限级分类(一) 中,我们介绍了两种简单的无限级分类构造方法。下面介绍一种从树形结构中获取子结构的方法:...

  • PHP递归实现无限级分类

    PHP递归实现无限级分类 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性。那么PHP是如何...

网友评论

    本文标题:无限级分类

    本文链接:https://www.haomeiwen.com/subject/bvcpjftx.html