Search code examples
phparrayslistsortingsub-array

Recursive array listing catetegory


I have a multi-dimensional array:

Array
(
    [0] => Array
    (
        [category_id] => 20
        [category_name] => Category 1
        [main_category] => 0
        [sub_categories] => Array
            (

                [0] => Array
                    (
                        [category_id] => 25
                        [category_name] => Category 1.3
                        [main_category] => 20
                        [sub_categories] => 
                    )

                [1] => Array
                    (
                        [category_id] => 26
                        [category_name] => Category 1.4
                        [main_category] => 20
                        [sub_categories] => Array
                            (
                                [0] => Array
                                    (
                                        [category_id] => 30
                                        [category_name] => Category 1.4.1
                                        [main_category] => 26
                                        [sub_categories] => 
                                    )

                                [1] => Array
                                    (
                                        [category_id] => 31
                                        [category_name] => Category 1.4.2
                                        [main_category] => 26
                                        [sub_categories] => 
                                    )

                            )

                    )
    [1] => Array
        (
            [category_id] => 19
            [category_name] => Category 2
            [main_category] => 0
            [sub_categories] => 
        )
)

Would become:

Array
(
    [0] => Array
    (
        [category_id] => 20
        [category_name] => Category 1
    )
    [1] => Array
    (
        [category_id] => 25
        [category_name] => Category 1 -> Category 1.3
    )
    [2] => Array
    (
        [category_id] => 26
        [category_name] => Category 1 -> Category 1.4
    )
    [3] => Array
    (
        [category_id] => 30
        [category_name] => Category 1 -> Category 1.4 -> Category 1.4.1
    )
    [4] => Array
    (
        [category_id] => 31
        [category_name] => Category 1 -> Category 1.4 -> Category 1.4.2
    )
    [5] => Array
    (
         [category_id] => 19
         [category_name] => Category 2
    )
)

Solution

  • You can loop over all data in a recursive manner. While doing so, pass all ancestors to the next level children and add all of them to a new variable, say $result and print them in the end.

    Snippet:

    function getChildren($data,$parents,&$result){
        foreach($data as $current_category){
            $temp = [];
            $temp['category_id'] = $current_category['category_id'];
            $new_cat_sequence =  array_merge($parents,[$current_category['category_name']]);
            $temp['category_name'] = implode(" -> ",$new_cat_sequence);
            $result[] = $temp;
            getChildren($current_category['sub_categories'],$new_cat_sequence,$result);
        }
    }
    

    Demo: https://3v4l.org/QN4NP