【问题标题】:How can I make this loop a recursive loop?如何使这个循环成为递归循环?
【发布时间】:2017-09-15 16:56:25
【问题描述】:

我编写了一个循环,首先检查在这种情况下,类别是否有任何基于子类别表中名为“category_id”的数据库中的字段的子类别。

我希望它在这里做的是递归检查子类别,看看是否有任何子类别将“parent_id”设置为相应的 id。检查需要做的是添加到一个数组中(参见下面的代码 sn-p 以获得更好的解释)。

首先说明一个示例结构:

Main Category
- Sub category level 1 (identified by 'category_id' matching 'id' of Main Category)
- - Sub category level 2 (identified by 'parent_id' matching 'id' of Sub category level 1
- - - Sub category level 3 (identified by 'parent_id' matching 'id' of Sub category level 2

这打算无限期地继续下去。下面是一个正确执行任务的非递归函数示例:

$final = [];

    foreach($values as $k => $v) {
        $check = collect(Subcategory::where('category_id', $v['id'])->get());
        $v['subcategory'] = 0;
        $final[] = $v;
        if (count($check) > 0) {
            foreach($check as $c) {
                $val = $c->toArray();
                $val['name'] = '- '.$val['name'];
                $val['subcategory'] = 1;
                $final[] = $val;
                /* recursive here onward */
                $check2 = collect(Subcategory::where('parent_id', $c['id'])->get());
                if (count($check2) > 0) {
                    foreach($check2 as $c) {
                        $val = $c->toArray();
                        $val['name'] = '- - '.$val['name'];
                        $final[] = $val;
                        $check3 = collect(Subcategory::where('parent_id', $c['id'])->get());
                        if (count($check3) > 0) {
                            foreach($check3 as $c) {
                                $val = $c->toArray();
                                $val['name'] = '- - - '.$val['name'];
                                $final[] = $val;
                            }
                        }
                    }
                }
            }
        }
    }

尽管看到重复的部分,但我无法弄清楚如何进行递归。任何人都可以建议一个递归函数,在检查返回 0 之前始终执行代码 sn-p 中“递归此处向前”以下的内容?

【问题讨论】:

  • 简短说明:将foreach(){} 包装在一个函数中,并在if(count($check)>0) { } 中调用此函数,并以$check 作为参数。

标签: php arrays laravel function recursion


【解决方案1】:

通常,您希望从递归函数中获得的结果是使用上一步获取的数据进行新计算,并且您可能还需要您所处的递归级别。

在您的情况下,您需要提供函数的数据是类别 ID 和递归级别。

所以我建议你试试下面的代码:

function getSubCategories($id, $level) {
    $check = collect(Subcategory::where('category_id', $id)->get());
    $subCategories = array();
    foreach ($check as $c) {
        $val = $c->toArray();
        $subCategories[] = array(
            'id' => $val['id'],
            'name' => str_repeat('- ', $level) .$val['name'],
            'level' => $level,
            'subIds' => getSubCategories($val['id'], ++$level)
        );
    }
    return $subCategories;
}
// Call the function.
$categories = array(
    'id' => 1,
    'name' => 'name',
    'level' => 0,
    'subIds' => getSubCategories(1, 1)
);

最后你可以使用另一个递归函数来打印你的数据,比如这个:

function printR($category) {
    print $category['name'] . $category['level'] . "\n";
    foreach ($category['subIds'] as $sub) {
        printR($sub);
    }
}
printR($categories);

【讨论】:

  • 优秀 - 这正是我一直在寻找的正确方向。对其进行了一些修改以适应我的工作并完美地工作。谢谢
猜你喜欢
  • 2011-02-12
  • 1970-01-01
  • 2022-11-19
  • 2018-06-27
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多