Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.8k views
in Technique[技术] by (71.8m points)

递归如何获取无限极分类?

有一张分类表,如何使返回的结果是无限极children?recursiveData方法哪里有问题?谢谢。
show()方法返回结果是:
image.png

public function show()
    {
        $data = $this->getData(0);
        $res = $this->recursiveData($data);
        echo json_encode($res);
    }

    public function recursiveData($data)
    {
        if (empty($data)) {
            return false;
        }

        $children = [];
        foreach ($data as $dk => $dv) {
            $children = $this->getData($dv['id']);
            $data[$dk]['children'] = $children;
            $this->recursiveData($children);
        }
        return $data;
    }

    /**
     * Get data from database.
     * @return array
     **/
    public function getData($parent_id)
    {
        $tmp  = [];
        $data = DB::select('select id,title from category where parent_id<99 and parent_id = ?', [$parent_id]);
        foreach ($data as $dk => $dv) {
            $tmp[] = [
                'id'       => $dv->id,
                'title'    => $dv->title,
                'parentId' => $parent_id,
            ];
        }
        return $tmp;
    }

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

可以考虑把数据一次性都拿出来,然后在递归组装

public function _tagTree($data, $maxLev, $parentId = 0, $level = 1)
{
    $tree = [];
    foreach ($data as $key => $val) {
        if($val['parent_id'] == $parentId && $level <= $maxLev) {
            $_val = $val;
            
            //减少无效循环
 unset($data[$key]);
            $_val['child'] = $this->tagTree($data, $maxLev, $val['tag_id'], $level + 1);
            $tree[] = $_val;
        }
    }
    return $tree;
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...