php - 通过递归找到最伟大的父母
问题描述
我有一个包含子类别的类别列表。一个类别最多可以有 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才再次播放。
在此先感谢您的帮助。
解决方案
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();
}
推荐阅读
- python - python unittest:模拟一个类似字典的对象
- r - 如何仅在 R 中数据框中的选定行中添加命名向量?
- java - 如何播放 Android 本身不支持的音频编解码器
- python - 在jupyter中打印复数矩阵更漂亮
- laravel - 订单项目无法在 Laravel 的采购订单视图中显示
- python - 在导入 Jupyter 笔记本时从 py 文件更新脚本
- google-chrome - 动画 GIF 在 Chrome 中抗锯齿,但在 Firefox 或 Edge 中没有
- r - R:创建带有省略号参数的函数时的词法范围问题
- drupal - Drupal 8 中的查询段落类型
- python - 如何直接访问枚举的值作为类属性?