我有点困惑如何重构返回数组数据,而不是在$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`
}
答案 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]
推送到递归生成列表的末尾。