首页 > 解决方案 > 通过递归找到最伟大的父母

问题描述

我有一个包含子类别的类别列表。一个类别最多可以有 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才再次播放。

在此先感谢您的帮助。

标签: phparraysfunctionrecursion

解决方案


I found out two different approaches, first using recursion:

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

And using a while loop:

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

推荐阅读