2

I hope somebody can help, this is driving me crazy!

I have a simply recursive PHP function for getting all parents to any given parent for a list of categories. You simply pass it the parent category ID for any given category and it will recursively get all the parents further up the tree.

function getParentCategoriesById($parent_category_id,array $parents = []){
if(empty($parent_category_id)) {
 return [];
}
$parents[] = $parent_category_id;
$parent_category = DB::builder()->table('product_categories')->find($parent_category_id);
if(!empty($parent_category->parent)) {
 getParentCategoriesById($parent_category->parent,$parents);
}
return $parents;}

Let's say category id=100 has 2 parents (33->37), if I dump the $parents array just before the return, the results are:

Array
(
 [0] => 33
 [1] => 37
)
Array
(
 [0] => 33
)

The first array returned is the correct result, but I don't understand how the function is re-running and then instead returning only the first parent.

asked Sep 6, 2017 at 10:36
1
  • 1
    You are not doing anything with the result of your second getParentCategoriesById call. And the array itself is not modified, you’d have to pass it per reference for that to happen. Commented Sep 6, 2017 at 10:41

1 Answer 1

3

You should pass reference to $parents in internal call to getParentCategoriesById()

function getParentCategoriesById($parent_category_id, array &$parents = []) { ... }
answered Sep 6, 2017 at 10:42
2
  • Thanks, although due to my PHP version I had to pay the reference in the function definition: private function getParentCategoriesById($parent_category_id,array &$parents = []) Commented Sep 6, 2017 at 10:52
  • Also no need to return this array. Commented Sep 6, 2017 at 10:54

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.