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

有一张分类表,如何使返回的结果是无限极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;
    }
阅读 3k
3 个回答

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

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;
}
$data[$dk]['children'] = $children;
$this->recursiveData($children);

改成

$data[$dk]['children'] = $this->recursiveData($children); 

不要在循环里面嵌套sql查询

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题