无限级分类

作者: 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;

        }

    相关文章

      网友评论

        本文标题:无限级分类

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