I'll-Be-Back
I'll-Be-Back

Reputation: 10828

Return data from Recursive Function?

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

Answers (1)

shudder
shudder

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

Related Questions