Search code examples
phparraysmultidimensional-arraycodeigniter-2

How can manage multidimensional array in foreach() for tree view while multidimensional array form of multi level


I have this tree view of my nested array:

The Tree view

My questions:

  • I need to remove empty subarrays from this array, but array_filter() does not do this in a nested array. How can I achieve this?

  • What is the right way to use a multidimensional array in my case?

  • How to use a nested foreach() when I have a multidimensional array?

I have the following code:

foreach($legs as $element => $child_2){ 
    $result .= "{'name': '".$child_2['fullname']."', 'title': '".$child_2['gcn_id']."',";
    $result .= "'children': [";
    foreach($child_2 as $element_1 => $child_3){
        $result .="{'name': '".$child_3."', 'title': '".$child_3."',";
        $result .= "'children': [";
        foreach($child_3 as $element_2 => $child_4){
            $result.= "{ 'name': '".$child_4."', 'title': '".$child_4."' ,";
            $result .= "'children': [";
            /* foreach($child_4 as $k3=>$v3){
                #array_filter($v3);
                $result .= "{'name': '".$v3['fullname']."', 'title': '".$v3['gcn_id']."'},"; 

                }
            */
            $result .= "]},";
        }
        $result .= "]},";
    }
    $result .= "]";
    $result .= "},";
}

I have the following array:

Array(
[0] => Array
    (
        [gcn_id] => 11312
        [fullname] => Wendy-Lynn Barr
        [referral_id] => 5063
    )

[1] => Array
    (
        [gcn_id] => 5064
        [fullname] => Ed Kilgour
        [referral_id] => 5063
    )

[2] => Array
    (
        [gcn_id] => 10276
        [fullname] => Joseph Melendez Motijo
        [referral_id] => 5063
    )

[3] => Array
    (
        [gcn_id] => 10050
        [fullname] => DIOGENES  ORTEGA
        [referral_id] => 5063
    )

[4] => Array
    (
        [gcn_id] => 10050
        [fullname] => DIOGENES  ORTEGA
        [referral_id] => 5063
    )

[5] => Array
    (
        [gcn_id] => 5371
        [fullname] => Roberto  Montero
        [referral_id] => 5063
    )

[6] => Array
    (
        [0] => Array
            (
                [gcn_id] => 11303
                [fullname] => Pauline Blake
                [referral_id] => 11312
            )

        [1] => 
    )

[7] => Array
    (
        [0] => Array
            (
                [gcn_id] => 11302
                [fullname] => Craig Corbitt
                [referral_id] => 5064
            )

        [1] => Array
            (
                [0] => Array
                    (
                        [gcn_id] => 5175
                        [fullname] => Kristi  Iles
                        [referral_id] => 11302
                    )

                [1] => Array
                    (
                        [0] => Array
                            (
                                [gcn_id] => 6013
                                [fullname] => Joshua  Iles
                                [referral_id] => 5175
                            )

                        [1] => 
                    )

                [2] => Array
                    (
                        [gcn_id] => 6308
                        [fullname] => Chris Chowning
                        [referral_id] => 11302
                    )

                [3] => Array
                    (
                        [0] => Array
                            (
                                [gcn_id] => 10039
                                [fullname] => Martha  Rios
                                [referral_id] => 6308
                            )

                        [1] => 
                        [2] => Array
                            (
                                [gcn_id] => 10020
                                [fullname] => Mel  Navarrette
                                [referral_id] => 6308
                            )

                        [3] => Array
                            (
                                [0] => Array
                                    (
                                        [gcn_id] => 10040
                                        [fullname] => Aaron  Thompson
                                        [referral_id] => 10020
                                    )

                                [1] => 
                            )

                        [4] => Array
                            (
                                [gcn_id] => 10013
                                [fullname] => April Young
                                [referral_id] => 6308
                            )

                        [5] => 
                    )

            )

        [2] => Array
            (
                [gcn_id] => 6239
                [fullname] => Glen Starr
                [referral_id] => 5064
            )

        [3] => 
        [4] => Array
            (
                [gcn_id] => 5155
                [fullname] => Allen Taylor
                [referral_id] => 5064
            )

        [5] => Array
            (
                [0] => Array
                    (
                        [gcn_id] => 5309
                        [fullname] => Deborah Taylor
                        [referral_id] => 5155
                    )

                [1] => 
            )

        [6] => Array
            (
                [gcn_id] => 5078
                [fullname] => Roger  Grosser
                [referral_id] => 5064
            )

        [7] => Array
            (
                [0] => Array
                    (
                        [gcn_id] => 7643
                        [fullname] => Sam Negrete
                        [referral_id] => 5078
                    )

                [1] => Array
                    (
                        [0] => Array
                            (
                                [gcn_id] => 5922
                                [fullname] => Claudia Negrete
                                [referral_id] => 7643
                            )

                        [1] => 
                    )

                [2] => Array
                    (
                        [gcn_id] => 5319
                        [fullname] => Richard Phillips
                        [referral_id] => 5078
                    )

                [3] => 
                [4] => Array
                    (
                        [gcn_id] => 6224
                        [fullname] => Mike South
                        [referral_id] => 5078
                    )

                [5] => 
                [6] => Array
                    (
                        [gcn_id] => 5079
                        [fullname] => Keith Gibson
                        [referral_id] => 5078
                    )

                [7] => 
                [8] => Array
                    (
                        [gcn_id] => 6759
                        [fullname] => Lamar White
                        [referral_id] => 5078
                    )

                [9] => 
                [10] => Array
                    (
                        [gcn_id] => 5100
                        [fullname] => Sharlette  Poe
                        [referral_id] => 5078
                    )

                [11] => 
                [12] => Array
                    (
                        [gcn_id] => 6600
                        [fullname] => Ohanna  McKenzie
                        [referral_id] => 5078
                    )

                [13] => Array
                    (
                        [0] => Array
                            (
                                [gcn_id] => 7391
                                [fullname] => Maria Ramm 
                                [referral_id] => 6600
                            )

                        [1] => 
                    )

                [14] => Array
                    (
                        [gcn_id] => 7492
                        [fullname] => Kyle  Grosser
                        [referral_id] => 5078
                    )

                [15] => 
                [16] => Array
                    (
                        [gcn_id] => 10007
                        [fullname] => Rachael  Grosser
                        [referral_id] => 5078
                    )

                [17] => 
                [18] => Array
                    (
                        [gcn_id] => 5122
                        [fullname] => Joe Simpson
                        [referral_id] => 5078
                    )

                [19] => Array
                    (
                        [0] => Array
                            (
                                [gcn_id] => 5189
                                [fullname] => Alan Wright
                                [referral_id] => 5122
                            )

                        [1] => 
                        [2] => Array
                            (
                                [gcn_id] => 5577
                                [fullname] => Haley  Simpson
                                [referral_id] => 5122
                            )

                        [3] => 
                        [4] => Array
                            (
                                [gcn_id] => 5167
                                [fullname] => Carl  Troutt
                                [referral_id] => 5122
                            )

                        [5] => Array
                            (
                                [0] => Array
                                    (
                                        [gcn_id] => 5168
                                        [fullname] => Eugene  Martinez
                                        [referral_id] => 5167
                                    )

                                [1] => 
                                [2] => Array
                                    (
                                        [gcn_id] => 5168
                                        [fullname] => Eugene  Martinez
                                        [referral_id] => 5167
                                    )

                                [3] => 
                            )

                        [6] => Array
                            (
                                [gcn_id] => 7686
                                [fullname] => James  Matthew Guy
                                [referral_id] => 5122
                            )

                        [7] => Array
                            (
                                [0] => Array
                                    (
                                        [gcn_id] => 7843
                                        [fullname] => Ethan  Guy
                                        [referral_id] => 7686
                                    )

                                [1] => 
                            )

                        [8] => Array
                            (
                                [gcn_id] => 10070
                                [fullname] => Rogelio Perez
                                [referral_id] => 5122
                            )

                        [9] => 
                        [10] => Array
                            (
                                [gcn_id] => 7125
                                [fullname] => Floyd Bowen
                                [referral_id] => 5122
                            )

                        [11] => 
                        [12] => Array
                            (
                                [gcn_id] => 7773
                                [fullname] => Kyle Overton
                                [referral_id] => 5122
                            )

                        [13] => 
                        [14] => Array
                            (
                                [gcn_id] => 5972
                                [fullname] => Kevin Farrell
                                [referral_id] => 5122
                            )

                        [15] => 
                    )

                [20] => Array
                    (
                        [gcn_id] => 5689
                        [fullname] => Troy  Shutt
                        [referral_id] => 5078
                    )

                [21] => 
                [22] => Array
                    (
                        [gcn_id] => 5588
                        [fullname] => Keith  Noble
                        [referral_id] => 5078
                    )

                [23] => 
                [24] => Array
                    (
                        [gcn_id] => 5127
                        [fullname] => Stewart Allen
                        [referral_id] => 5078
                    )

                [25] => Array
                    (
                        [0] => Array
                            (
                                [gcn_id] => 5448
                                [fullname] => Javier Ballesteros
                                [referral_id] => 5127
                            )

                        [1] => 
                    )

                [26] => Array
                    (
                        [gcn_id] => 5180
                        [fullname] => Travis Dooley
                        [referral_id] => 5078
                    )

                [27] => Array
                    (
                        [0] => Array
                            (
                                [gcn_id] => 5246
                                [fullname] => Fackrell's  Service
                                [referral_id] => 5180
                            )

                        [1] => Array
                            (
                                [0] => Array
                                    (
                                        [gcn_id] => 5676
                                        [fullname] => LuAnn  Fackrell
                                        [referral_id] => 5246
                                    )

                                [1] => 
                                [2] => Array
                                    (
                                        [gcn_id] => 7784
                                        [fullname] => Chad Barnhart
                                        [referral_id] => 5246
                                    )

                                [3] => 
                            )

                        [2] => Array
                            (
                                [gcn_id] => 5246
                                [fullname] => Fackrell's  Service
                                [referral_id] => 5180
                            )

                        [3] => Array
                            (
                                [0] => Array
                                    (
                                        [gcn_id] => 5676
                                        [fullname] => LuAnn  Fackrell
                                        [referral_id] => 5246
                                    )

                                [1] => 
                                [2] => Array
                                    (
                                        [gcn_id] => 7784
                                        [fullname] => Chad Barnhart
                                        [referral_id] => 5246
                                    )

                                [3] => 
                            )

                        [4] => Array
                            (
                                [gcn_id] => 5246
                                [fullname] => Fackrell's  Service
                                [referral_id] => 5180
                            )

                        [5] => Array
                            (
                                [0] => Array
                                    (
                                        [gcn_id] => 5676
                                        [fullname] => LuAnn  Fackrell
                                        [referral_id] => 5246
                                    )

                                [1] => 
                                [2] => Array
                                    (
                                        [gcn_id] => 7784
                                        [fullname] => Chad Barnhart
                                        [referral_id] => 5246
                                    )

                                [3] => 
                            )

                        [6] => Array
                            (
                                [gcn_id] => 5246
                                [fullname] => Fackrell's  Service
                                [referral_id] => 5180
                            )

                        [7] => Array
                            (
                                [0] => Array
                                    (
                                        [gcn_id] => 5676
                                        [fullname] => LuAnn  Fackrell
                                        [referral_id] => 5246
                                    )

                                [1] => 
                                [2] => Array
                                    (
                                        [gcn_id] => 7784
                                        [fullname] => Chad Barnhart
                                        [referral_id] => 5246
                                    )

                                [3] => 
                            )

                    )

                [28] => Array
                    (
                        [gcn_id] => 5166
                        [fullname] => Adan Mosqueda
                        [referral_id] => 5078
                    )

                [29] => 
                [30] => Array
                    (
                        [gcn_id] => 5349
                        [fullname] => EDMOND WILSON
                        [referral_id] => 5078
                    )

                [31] => Array
                    (
                        [0] => Array
                            (
                                [gcn_id] => 7380
                                [fullname] => Rich Anderson
                                [referral_id] => 5349
                            )

                        [1] => 
                        [2] => Array
                            (
                                [gcn_id] => 7346
                                [fullname] => Peter  Smith
                                [referral_id] => 5349
                            )

                        [3] => 
                        [4] => Array
                            (
                                [gcn_id] => 6722
                                [fullname] => Larry Schaben
                                [referral_id] => 5349
                            )

                        [5] => Array
                            (
                                [0] => Array
                                    (
                                        [gcn_id] => 7148
                                        [fullname] => Cam Callender
                                        [referral_id] => 6722
                                    )

                                [1] => Array
                                    (
                                        [0] => Array
                                            (
                                                [gcn_id] => 7313
                                                [fullname] => Sherrie Callender
                                                [referral_id] => 7148
                                            )

                                        [1] => 
                                    )

                                [2] => Array
                                    (
                                        [gcn_id] => 10009
                                        [fullname] => Kathy Schaben
                                        [referral_id] => 6722
                                    )

                                [3] => 
                            )

                        [6] => Array
                            (
                                [gcn_id] => 10011
                                [fullname] => Cornelius Reed
                                [referral_id] => 5349
                            )

                        [7] => 
                    )

                [32] => Array
                    (
                        [gcn_id] => 5320
                        [fullname] => Joe Coon
                        [referral_id] => 5078
                    )

                [33] => Array
                    (
                        [0] => Array
                            (
                                [gcn_id] => 5573
                                [fullname] => Denise Coon
                                [referral_id] => 5320
                            )

                        [1] => 
                    )

                [34] => Array
                    (
                        [gcn_id] => 10168
                        [fullname] => Jerry Curtis 
                        [referral_id] => 5078
                    )

                [35] => 
            )

        [8] => Array
            (
                [gcn_id] => 5310
                [fullname] => Rodney  Licari
                [referral_id] => 5064
            )

        [9] => Array
            (
                [0] => Array
                    (
                        [gcn_id] => 6041
                        [fullname] => Bryan  Russel Sevrence
                        [referral_id] => 5310
                    )

                [1] => 
            )

        [10] => Array
            (
                [gcn_id] => 5097
                [fullname] => James Yates
                [referral_id] => 5064
            )

        [11] => Array
            (
                [0] => Array
                    (
                        [gcn_id] => 10045
                        [fullname] => Christopher Edwards
                        [referral_id] => 5097
                    )

                [1] => 
                [2] => Array
                    (
                        [gcn_id] => 7193
                        [fullname] => Ed Kilgour
                        [referral_id] => 5097
                    )

                [3] => 
                [4] => Array
                    (
                        [gcn_id] => 5647
                        [fullname] => Talonda Yates
                        [referral_id] => 5097
                    )

                [5] => 
                [6] => Array
                    (
                        [gcn_id] => 6228
                        [fullname] => Calvin  Pearson
                        [referral_id] => 5097
                    )

                [7] => 
                [8] => Array
                    (
                        [gcn_id] => 10105
                        [fullname] => Marsha Wade
                        [referral_id] => 5097
                    )

                [9] => 
                [10] => Array
                    (
                        [gcn_id] => 5677
                        [fullname] => Brenda  Joyner
                        [referral_id] => 5097
                    )

                [11] => 
                [12] => Array
                    (
                        [gcn_id] => 7670
                        [fullname] => Bonny  Lewis
                        [referral_id] => 5097
                    )

                [13] => 
                [14] => Array
                    (
                        [gcn_id] => 5231
                        [fullname] => Brent  Coursey
                        [referral_id] => 5097
                    )

                [15] => 
                [16] => Array
                    (
                        [gcn_id] => 5971
                        [fullname] => James  Yates, II
                        [referral_id] => 5097
                    )

                [17] => 
                [18] => Array
                    (
                        [gcn_id] => 5602
                        [fullname] => Glenn  Yates
                        [referral_id] => 5097
                    )

                [19] => 
                [20] => Array
                    (
                        [gcn_id] => 10004
                        [fullname] => Sarah  Williams
                        [referral_id] => 5097
                    )

                [21] => 
                [22] => Array
                    (
                        [gcn_id] => 10004
                        [fullname] => Sarah  Williams
                        [referral_id] => 5097
                    )

                [34] => Array
                    (
                        [gcn_id] => 7041
                        [fullname] => Lamont Bartlett
                        [referral_id] => 5097
                    )

                [35] => 
                [36] => Array
                    (
                        [gcn_id] => 0
                        [fullname] => Eric Haut
                        [referral_id] => 5097
                    )

                [37] => 
            )

    )
)

multidimensional array

The desired output for the above input would start like this:

{ 
    "children": [{
        "name": "Wendy-Lynn Barr", 
        "title": "11312", 
        "children": [{
            "name": "Pauline Blake", 
            "title": "11303", 
            "children":[{
                "name":"Pauline Blake",
                "title":"11312",
            }]
        }]
    },{
        "title": "5064", 
        "name": "Ed Kilgour", 
        "referral_id": "5063", 
        'children': [{ 
            'name': 'Glen Starr', 
            'title': '6239' 
        },{ 
            'name': 'Allen Taylor',
            'title': '5155'
        },{ 
            'name': 'Roger Grosser', 
            'title': '5078'
        },{
            'name': 'Rodney Licari',
            'title': '5310'
        },{
            'name': 'Craig Corbitt',
            'title':'11302'
        },{ 
            'name': 'James Yates', 
            'title': '5097'
        }]
    }, 
    { /* ...etc */ },
    ]
}

Solution

  • Indeed array_filter does not work recursively.

    Here is a recursive function that does the job of taking out null values:

    function array_filter_recursive($arr, $cb = null) {
        if (empty($cb)) {
            $cb = function ($el) {
                return $el;
            };
        }
        $result = [];
        foreach($arr as $key => $val) {
            if (is_array($val)) $val = array_filter_recursive($val, $cb);
            if ($cb($val)) $result[$key] = $val;
        }
        return $result;
    }
    

    In general you need recursion (a function that calls itself) to solve problems involving arbitrary deeply nested arrays.

    Now to your actual desired output (which I transferred from your comments into your question): that looks like JSON, for which you can use json_encode. There should never be a reason to build such a string yourself.

    So you should never write something like this:

    $result.= "{ 'name': '".$child_4."', 'title': '".$child_4."' ,";
    

    For generating the specific output you are looking for, you could use this function:

    function convert($arr) {
        $result = [];
        $byId = [];
    
        function recurse(&$result, &$byId, $arr) {
            if (!is_array($arr)) return;
            if (isset($arr["gcn_id"])) {
                $parent = $arr["referral_id"];
                $record = [
                    "name" => $arr["fullname"],
                    "title" => $arr["gcn_id"]
                ];
                $byId[$arr["gcn_id"]] = &$record; 
                if (isset($byId[$parent])) {
                    $byId[$parent]["children"][] = &$record;
                } else {
                    $result[] = &$record;
                }
            } else {
                foreach($arr as $child) {
                    recurse($result, $byId, $child);
                }
            }
        }
    
        recurse($result, $byId, $arr);    
        return $result;
    }
    
    $result = json_encode(convert($legs), JSON_PRETTY_PRINT);
    
    echo $result;
    

    See it run on eval.in. It produces this output:

    [
        {
            "name": "Wendy-Lynn Barr",
            "title": 11312,
            "children": [
                {
                    "name": "Pauline Blake",
                    "title": 11303
                }
            ]
        },
        {
            "name": "Ed Kilgour",
            "title": 5064,
            "children": [
                {
                    "name": "Craig Corbitt",
                    "title": 11302,
                    "children": [
                        {
                            "name": "Kristi  Iles",
                            "title": 5175,
                            "children": [
                                {
                                    "name": "Joshua  Iles",
                                    "title": 6013
                                }
                            ]
                        },
                        {
                            "name": "Chris Chowning",
                            "title": 6308,
                            "children": [
                                    // ...etc
    

    The key here is not only recursion, but also referencing a record by its ID (title). This referencing can be done with the & symbol, both in function parameters and in assignments.