【问题标题】:Find Greatest Parent by recursion通过递归找到最伟大的父母
【发布时间】:2021-08-10 22:06:16
【问题描述】:

我有一个包含子类别的类别列表。一个类别最多可以有 4 个类别。 每个类别都有一个唯一的 id 并有一个父 id。

我想写一个递归函数,添加一个对象数组作为第一个参数,一个整数作为第二个参数,这个整数代表一个id。

输入这个 id,我想知道哪个是最外层的父 id。

例如这里是数据结构:

$data = [
    {
        "id": 1,
        "name" : 'Main category',
        "parent": 0,
    },
    {
        "id": 2,
        "name" : 'Sub Category 1',
        "parent": 1,
    },
    {
        "id": 3,
        "name" : 'Sub Category 2',
        "parent": 2,
    },
    {
        "id": 4,
        "name" : 'Sub Category 3',
        "parent": 3,
    },
]

我想要一个函数getParentId($data, 4)

输出将是

{
    "id": 1,
    "name" : 'Main category',
    "parent": 0,
},

因为 id 为 4 的类别有一个 id 为 3 的父类。id 为 3 的类别有一个 id 为 2 的父类,等等。因为它们都是相关的,所以输出将是主类别id = 1 和 parent = 0,因为没有父级了。

在现实生活中,我有数百个类别,每个类别都可以嵌套许多子类别

到目前为止,我尝试过类似的递归

function getParentId($repo,$id){
    $result = [];
    $data = $repo->findById($id);
    $data = $data[0];

    //base case
    if($data->getParentId() == 0){
        $result[] = $data;
    } else {
        $data = $repo->findById($data->getParentId());
        $data = $data[0];
        if($data->getParentId() == 0){
            $result[] = $data;
        } else {
            getParentId($repo,$data->getId());
        }
    } 
    return $result;
} 

我不知道为什么,它似乎直到父级为0才再次播放。

提前感谢您的帮助。

【问题讨论】:

  • 你不会对递归调用getParentId的返回值做任何事情。
  • 在我看来,在您的递归中,即基本情况下的 else 块,它应该是 getParentId($repo,$data->getParentId()); [嵌套在其中的 else 块的一部分]。另外,检查getParentId($repo,$data->getId()); 是否应该是getParentId($repo,$data->getParentId());

标签: php arrays function recursion


【解决方案1】:

我发现了两种不同的方法,首先使用递归:

function getRootCategory($repo, $id) {
  $category = $repo->findById($id)[0];
  if ($category->getParentId() == 0) return $category;
  return getRootCategory($repo, $category->getParentId());
}

并使用 while 循环:

function getParentId($repo,$id){
 $category = $repo->findById($id)[0];
                   
 while($category->getParentId() !== 0) {
 $category = $repo->findById($category->getParentId())[0];
 }
                          
 return $category->getId();
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    相关资源
    最近更新 更多