无限级分类

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;

    }

你可能感兴趣的:(无限级分类)