Reputation: 10828
I am slightly confused how do I refactor to return array data instead storing $this->data
in the makeData()
method.
For example:
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);
}
}
Usage
foreach($items as $item) {
$this->data = []
$this->makeData($cat, $item->id);
// Then do something with `$this->data`
}
Then do something with $this->data
It seem this look like a code smell, in there a way to return data from makeData()
when the Recursive is completed? For example:
foreach($items as $item) {
$data = $this->makeData($cat, $item->id);
// Then do something with `$data`
}
Upvotes: 0
Views: 125
Reputation: 2101
You dont need recursion in this simple case. You can change point of reference in loop:
function ancestors($data, $id) {
$result = [];
while ($id = $data[$id]->parent_id ?? false) {
$result[] = $data[$id];
}
return $result;
}
Recursion would require dragging result and appending to it or array merging/unshifting (since its only one value at a time):
function ancestors($data, $id) {
$result = [];
if ($id = $data[$id]->parent_id ?? false) {
$result = parents($data, $id);
array_unshift($result, $data[$id]);
}
return $result;
}
If reversed order doesn't bother you you might push $data[$id]
to the end of recursively produced list as well.
Upvotes: 1