从递归函数返回数据?

时间:2018-06-02 16:29:13

标签: php php-7

我有点困惑如何重构返回数组数据,而不是在$this->data方法中存储makeData()

例如:

private function makeData($cat, $itemCatId)
{
    $parentCat = $cat[$cat[$itemCatId]->parent_id];

     $this->data[] = $parentCat;

    if (!is_null($parentCat->parent_id)) {
        $this->makeData($cat, $parentCat->id);
    }
}

用法

foreach($items as $item) {
 $this->data = []
 $this->makeData($cat, $item->id);

 // Then do something with `$this->data`
}

然后使用$this->data

执行某些操作

看起来这看起来像代码气味,有一种方法可以在Recursive完成后从makeData()返回数据吗?例如:

foreach($items as $item) {
 $data = $this->makeData($cat, $item->id);

 // Then do something with `$data`
}

1 个答案:

答案 0 :(得分:1)

在这个简单的例子中你不需要递归。您可以在循环中更改参考点:

function ancestors($data, $id) {
    $result = [];
    while ($id = $data[$id]->parent_id ?? false) {
        $result[] = $data[$id];
    }
    return $result;
}

递归需要拖动结果并附加到它或数组合并/取消(因为它一次只有一个值):

function ancestors($data, $id) {
    $result = [];
    if ($id = $data[$id]->parent_id ?? false) {
        $result = parents($data, $id);
        array_unshift($result, $data[$id]);
    }

    return $result;
}

如果颠倒顺序不打扰你,你也可以将$data[$id]推送到递归生成列表的末尾。