【发布时间】: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