简体   繁体   中英

Creating parent-child array PHP

I have this flat array that I am trying to turn into a parent-child array:

Array
(
    [0] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_cze7b2e
        )

    [1] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_czeg8ay
        )

    [2] => Array
        (
            [parent_id] => t1_czeg8ay
            [id] => t1_czet481
        )

    [3] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_cze4whs
        )

    [4] => Array
        (
            [parent_id] => t1_cze4whs
            [id] => t1_cze9v0o
        )

    [5] => Array
        (
            [parent_id] => t1_cze9v0o
            [id] => t1_czec4vd
        )

    [6] => Array
        (
            [parent_id] => t1_czec4vd
            [id] => t1_czep9e2
        )

    [7] => Array
        (
            [parent_id] => t1_czep9e2
            [id] => t1_czf2k8e
        )

    [8] => Array
        (
            [parent_id] => t1_czec4vd
            [id] => t1_czeixa7
        )

    [9] => Array
        (
            [parent_id] => t1_cze9v0o
            [id] => t1_czecx26
        )

    [10] => Array
        (
            [parent_id] => t1_czecx26
            [id] => t1_czeenuz
        )

    [11] => Array
        (
            [parent_id] => t1_czeenuz
            [id] => t1_czeftkf
        )

    [12] => Array
        (
            [parent_id] => t1_czecx26
            [id] => t1_czehjrz
        )

    [13] => Array
        (
            [parent_id] => t1_czecx26
            [id] => t1_czeien4
        )

    [14] => Array
        (
            [parent_id] => t1_cze9v0o
            [id] => t1_czebugl
        )

    [15] => Array
        (
            [parent_id] => t1_cze4whs
            [id] => t1_cze9hvb
        )

    [16] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_cze3vku
        )

    [17] => Array
        (
            [parent_id] => t1_cze3vku
            [id] => t1_czemk0g
        )

    [18] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_czeedh9
        )

    [19] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_czeenjx
        )

    [20] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_cze5r5u
        )

    [21] => Array
        (
            [parent_id] => t1_cze5r5u
            [id] => t1_czefle4
        )

    [22] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_cze8oht
        )

    [23] => Array
        (
            [parent_id] => t1_cze8oht
            [id] => t1_czelwvs
        )

    [24] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_cze5cs6
        )

    [25] => Array
        (
            [parent_id] => t1_cze5cs6
            [id] => t1_czefydi
        )

    [26] => Array
        (
            [parent_id] => t1_cze5cs6
            [id] => t1_czedpml
        )

    [27] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_cze42aq
        )

    [28] => Array
        (
            [parent_id] => t1_cze42aq
            [id] => t1_cze8iei
        )

    [29] => Array
        (
            [parent_id] => t1_cze8iei
            [id] => t1_czebkgk
        )
    [30] => Array
        (
            [parent_id] => t1_czebkgk
            [id] => t1_czedid2
        )
    [31] => Array
        (
            [parent_id] => t1_cze8iei
            [id] => t1_czebqgn
        )
    [32] => Array
        (
            [parent_id] => t1_cze42aq
            [id] => t1_cze77xr
        )
    [33] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_czen20j
        )
)

Here is my recursive function that maps the ids and makes it into a parent-child array:

function buildTree(array $elements, $parentId = 0) {
    $branch = array();

    foreach ($elements as $element) {
        if ($element['parent_id'] == $parentId) {
            $children = buildTree($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[] = $element;
        }
    }

    return $branch;
}

Here is the output I am getting from the above function:

Array
(
    [0] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_cze7b2e
        )

    [1] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_czeg8ay
            [children] => Array
                (
                    [0] => Array
                        (
                            [parent_id] => t1_czeg8ay
                            [id] => t1_czet481
                        )

                )

        )

    [2] => Array
        (
            [parent_id] => t1_czeg8ay
            [id] => t1_czet481
        )

    [3] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_cze4whs
            [children] => Array
                (
                    [0] => Array
                        (
                            [parent_id] => t1_cze4whs
                            [id] => t1_cze9v0o
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [parent_id] => t1_cze9v0o
                                            [id] => t1_czec4vd
                                            [children] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [parent_id] => t1_czec4vd
                                                            [id] => t1_czep9e2
                                                            [children] => Array
                                                                (
                                                                    [0] => Array
                                                                        (
                                                                            [parent_id] => t1_czep9e2
                                                                            [id] => t1_czf2k8e
                                                                        )

                                                                )

                                                        )

                                                    [1] => Array
                                                        (
                                                            [parent_id] => t1_czec4vd
                                                            [id] => t1_czeixa7
                                                        )

                                                )

                                        )

                                    [1] => Array
                                        (
                                            [parent_id] => t1_cze9v0o
                                            [id] => t1_czecx26
                                            [children] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [parent_id] => t1_czecx26
                                                            [id] => t1_czeenuz
                                                            [children] => Array
                                                                (
                                                                    [0] => Array
                                                                        (
                                                                            [parent_id] => t1_czeenuz
                                                                            [id] => t1_czeftkf
                                                                        )

                                                                )

                                                        )

                                                    [1] => Array
                                                        (
                                                            [parent_id] => t1_czecx26
                                                            [id] => t1_czehjrz
                                                        )

                                                    [2] => Array
                                                        (
                                                            [parent_id] => t1_czecx26
                                                            [id] => t1_czeien4
                                                        )

                                                )

                                        )

                                    [2] => Array
                                        (
                                            [parent_id] => t1_cze9v0o
                                            [id] => t1_czebugl
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [parent_id] => t1_cze4whs
                            [id] => t1_cze9hvb
                        )

                )

        )

    [4] => Array
        (
            [parent_id] => t1_cze4whs
            [id] => t1_cze9v0o
            [children] => Array
                (
                    [0] => Array
                        (
                            [parent_id] => t1_cze9v0o
                            [id] => t1_czec4vd
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [parent_id] => t1_czec4vd
                                            [id] => t1_czep9e2
                                            [children] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [parent_id] => t1_czep9e2
                                                            [id] => t1_czf2k8e
                                                        )

                                                )

                                        )

                                    [1] => Array
                                        (
                                            [parent_id] => t1_czec4vd
                                            [id] => t1_czeixa7
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [parent_id] => t1_cze9v0o
                            [id] => t1_czecx26
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [parent_id] => t1_czecx26
                                            [id] => t1_czeenuz
                                            [children] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [parent_id] => t1_czeenuz
                                                            [id] => t1_czeftkf
                                                        )

                                                )

                                        )

                                    [1] => Array
                                        (
                                            [parent_id] => t1_czecx26
                                            [id] => t1_czehjrz
                                        )

                                    [2] => Array
                                        (
                                            [parent_id] => t1_czecx26
                                            [id] => t1_czeien4
                                        )

                                )

                        )

                    [2] => Array
                        (
                            [parent_id] => t1_cze9v0o
                            [id] => t1_czebugl
                        )

                )

        )

    [5] => Array
        (
            [parent_id] => t1_cze9v0o
            [id] => t1_czec4vd
            [children] => Array
                (
                    [0] => Array
                        (
                            [parent_id] => t1_czec4vd
                            [id] => t1_czep9e2
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [parent_id] => t1_czep9e2
                                            [id] => t1_czf2k8e
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [parent_id] => t1_czec4vd
                            [id] => t1_czeixa7
                        )

                )

        )

    [6] => Array
        (
            [parent_id] => t1_czec4vd
            [id] => t1_czep9e2
            [children] => Array
                (
                    [0] => Array
                        (
                            [parent_id] => t1_czep9e2
                            [id] => t1_czf2k8e
                        )

                )

        )

    [7] => Array
        (
            [parent_id] => t1_czep9e2
            [id] => t1_czf2k8e
        )

    [8] => Array
        (
            [parent_id] => t1_czec4vd
            [id] => t1_czeixa7
        )

    [9] => Array
        (
            [parent_id] => t1_cze9v0o
            [id] => t1_czecx26
            [children] => Array
                (
                    [0] => Array
                        (
                            [parent_id] => t1_czecx26
                            [id] => t1_czeenuz
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [parent_id] => t1_czeenuz
                                            [id] => t1_czeftkf
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [parent_id] => t1_czecx26
                            [id] => t1_czehjrz
                        )

                    [2] => Array
                        (
                            [parent_id] => t1_czecx26
                            [id] => t1_czeien4
                        )

                )

        )

    [10] => Array
        (
            [parent_id] => t1_czecx26
            [id] => t1_czeenuz
            [children] => Array
                (
                    [0] => Array
                        (
                            [parent_id] => t1_czeenuz
                            [id] => t1_czeftkf
                        )

                )

        )

    [11] => Array
        (
            [parent_id] => t1_czeenuz
            [id] => t1_czeftkf
        )

    [12] => Array
        (
            [parent_id] => t1_czecx26
            [id] => t1_czehjrz
        )

    [13] => Array
        (
            [parent_id] => t1_czecx26
            [id] => t1_czeien4
        )

    [14] => Array
        (
            [parent_id] => t1_cze9v0o
            [id] => t1_czebugl
        )

    [15] => Array
        (
            [parent_id] => t1_cze4whs
            [id] => t1_cze9hvb
        )

    [16] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_cze3vku
            [children] => Array
                (
                    [0] => Array
                        (
                            [parent_id] => t1_cze3vku
                            [id] => t1_czemk0g
                        )

                )

        )

    [17] => Array
        (
            [parent_id] => t1_cze3vku
            [id] => t1_czemk0g
        )

    [18] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_czeedh9
        )

    [19] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_czeenjx
        )

    [20] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_cze5r5u
            [children] => Array
                (
                    [0] => Array
                        (
                            [parent_id] => t1_cze5r5u
                            [id] => t1_czefle4
                        )

                )

        )

    [21] => Array
        (
            [parent_id] => t1_cze5r5u
            [id] => t1_czefle4
        )

    [22] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_cze8oht
            [children] => Array
                (
                    [0] => Array
                        (
                            [parent_id] => t1_cze8oht
                            [id] => t1_czelwvs
                        )

                )

        )

    [23] => Array
        (
            [parent_id] => t1_cze8oht
            [id] => t1_czelwvs
        )

    [24] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_cze5cs6
            [children] => Array
                (
                    [0] => Array
                        (
                            [parent_id] => t1_cze5cs6
                            [id] => t1_czefydi
                        )

                    [1] => Array
                        (
                            [parent_id] => t1_cze5cs6
                            [id] => t1_czedpml
                        )

                )

        )

    [25] => Array
        (
            [parent_id] => t1_cze5cs6
            [id] => t1_czefydi
        )

    [26] => Array
        (
            [parent_id] => t1_cze5cs6
            [id] => t1_czedpml
        )

    [27] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_cze42aq
            [children] => Array
                (
                    [0] => Array
                        (
                            [parent_id] => t1_cze42aq
                            [id] => t1_cze8iei
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [parent_id] => t1_cze8iei
                                            [id] => t1_czebkgk
                                            [children] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [parent_id] => t1_czebkgk
                                                            [id] => t1_czedid2
                                                        )

                                                )

                                        )

                                    [1] => Array
                                        (
                                            [parent_id] => t1_cze8iei
                                            [id] => t1_czebqgn
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [parent_id] => t1_cze42aq
                            [id] => t1_cze77xr
                        )

                )

        )

    [28] => Array
        (
            [parent_id] => t1_cze42aq
            [id] => t1_cze8iei
            [children] => Array
                (
                    [0] => Array
                        (
                            [parent_id] => t1_cze8iei
                            [id] => t1_czebkgk
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [parent_id] => t1_czebkgk
                                            [id] => t1_czedid2
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [parent_id] => t1_cze8iei
                            [id] => t1_czebqgn
                        )

                )

        )

    [29] => Array
        (
            [parent_id] => t1_cze8iei
            [id] => t1_czebkgk
            [children] => Array
                (
                    [0] => Array
                        (
                            [parent_id] => t1_czebkgk
                            [id] => t1_czedid2
                        )

                )

        )

    [30] => Array
        (
            [parent_id] => t1_czebkgk
            [id] => t1_czedid2
        )

    [31] => Array
        (
            [parent_id] => t1_cze8iei
            [id] => t1_czebqgn
        )

    [32] => Array
        (
            [parent_id] => t1_cze42aq
            [id] => t1_cze77xr
        )

    [33] => Array
        (
            [parent_id] => t3_42yrg7
            [id] => t1_czen20j
        )

)

While the first part of it is correct, it sometimes labels the child arrays as a parent after mapping it correctly the first time. Why are some child arrays being mapped as a parent?

Edit: I'm an idiot, when I calling buildTree() I was not passing in a parentId and just left the value as zero.

I don't know what you want exactly but I have added my code to separate parent and children in array. Please check below code:

function buildTree($elements = array()) {
    $branch = array();
    if(!empty($elements))
    {
        foreach ($elements as $element) {
            if(!isset($branch[$element['parent_id']]))
            {
                $branch['parent_id'][]=$element['parent_id'];
                $branch[$element['parent_id']]=array();
                $branch[$element['parent_id']]['children'][]=$element['id'];
            }
            else
            {
                $branch[$element['parent_id']]['children'][]=$element['id'];
            }
        }
    }
    return $branch;
}
$arr_rtn = buildTree($arr);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM