php类递归层次结构

时间:2012-06-08 20:36:15

标签: php recursion categories

我有这样的类别层次结构。

  • 721父母是235
  • 235父母是201
  • 201父母是1
  • 1父母是0

0是根类别ID,我正在尝试构建一个输入叶ID为721的函数,获取721,235,201,1的完整路径ID

public function getPath($inputId = 0, $idList=array())
{       
    $sql ="SELECT * FROM hierarchy where id='{$inputId}'";
    $result = $this->db->fetchAll($sql);

    if($result){
        $currentId = $result[0]["id"];
        $parentId = $result[0]["parent_id"];

        $idList[] = $currentId;

        if ($parentId !=0){
           $this->getPath($parentId, $idList);
        }else{
            //var_dump($idList);
            return $idList;
        }
    }

}

我可以在上面的var_dump部分看到正确的结果,但是当我从另一个类使用这个函数时,它返回null,就像这样 $ data = $ whateveHelper-> getPath('721');

有人可以帮忙吗?

由于

2 个答案:

答案 0 :(得分:3)

你只需要改变这个:

if ($parentId !=0){
    $this->getPath($parentId, $idList);
}

到此:

if ($parentId !=0){
    return $this->getPath($parentId, $idList);
}

然后你需要删除else子句并移动“return $ idList;”行到函数的底部,因此总是返回。上面的代码只会在$ parentId为0的情况下返回$ idList。但是,如果你以递归方式调用它,你需要函数总是返回一些东西。

我为你的整个功能推荐了这些内容:

public function getPath($inputId = 0, $idList=array())
{       
    $sql ="SELECT * FROM hierarchy where id='{$inputId}'";
    $result = $this->db->fetchAll($sql);

    if($result){
        $currentId = $result[0]["id"];
        $parentId = $result[0]["parent_id"];

        $idList[] = $currentId;

        if ($parentId !=0){
           return $this->getPath($parentId, $idList);
        }
    }
    return $idList;
}

请告诉我这是否适合您。

答案 1 :(得分:1)

该行:

$this->getPath($parentId, $idList);

需要

return $this->getPath($parentId, $idList);