如何在多层数组形式的多层数组形式中管理树视图中的foreach()多维数组

问题描述 投票:-1回答:1

我有我的嵌套数组的树视图:

我的问题:

  • 我需要从这个数组中删除空的子数组,但array_filter()不会在嵌套数组中执行此操作。我怎样才能做到这一点?
  • 在我的案例中使用多维数组的正确方法是什么?
  • 当我有一个多维数组时如何使用嵌套的foreach()

我有以下代码:

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 .= "},";
}

我有以下数组:

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

上述输入的所需输出将如下所示:

{ 
    "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 */ },
    ]
}
php arrays multidimensional-array codeigniter-2
1个回答
1
投票

确实array_filter不能递归地工作。

这是一个递归函数,可以取出null值:

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;
}

通常,您需要递归(一个调用自身的函数)来解决涉及任意深度嵌套数组的问题。

现在到你实际需要的输出(我从你的评论转移到你的问题):看起来像JSON,你可以使用json_encode。永远不应该有理由自己构建这样的字符串。

所以你永远不应该写这样的东西:

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

要生成您正在寻找的特定输出,您可以使用此功能:

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;

看它在eval.in上运行。它产生这个输出:

[
    {
        "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

这里的关键不仅是递归,还通过其ID(标题)引用记录。可以使用&符号在函数参数和赋值中完成此引用。

© www.soinside.com 2019 - 2024. All rights reserved.