Tim
Tim

Reputation: 3131

Assign parent ids to children of multidimensional arrays

I need to assign parent ids to all the children of a multidimensional array in PHP.

Array
(
    [expanded] => 1
    [key] => root_1
    [title] => root
    [children] => Array
        (
            [0] => Array
                (
                    [folder] => 1
                    [key] => 34
                    [title] => YAY PROJECTS
                )

            [1] => Array
                (
                    [expanded] => 1
                    [folder] => 1
                    [key] => 6
                    [title] => Grand Designs Episodes
                    [children] => Array
                        (
                            [0] => Array
                                (
                                    [folder] => 1
                                    [key] => 8
                                    [title] => AU Episodes
                                )

                            [1] => Array
                                (
                                    [expanded] => 1
                                    [folder] => 1
                                    [key] => 7
                                    [title] => UK Episodes
                                    [children] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [folder] => 
                                                    [key] => 9
                                                    [title] => Start something
                                                )

                                            [1] => Array
                                                (
                                                    [folder] => 
                                                    [key] => 2
                                                    [title] => Grand Designs Season 10
                                                )
                                        )
                                )
                        )
                )

            [2] => Array
                (
                    [expanded] => 1
                    [folder] => 1
                    [key] => 5
                    [title] => Animations
                    [children] => Array
                        (
                            [0] => Array
                                (
                                    [folder] => 
                                    [key] => 4
                                    [title] => Futurama Episode 191
                                )

                            [1] => Array
                                (
                                    [folder] => 
                                    [key] => 3
                                    [title] => Miniscule Series 5 Ep 1
                                )

                            [2] => Array
                                (
                                    [folder] => 
                                    [key] => 1
                                    [title] => The Simpsons Episode 459
                                )
                        )
                )

            [3] => Array
                (
                    [folder] => 1
                    [key] => 11
                    [title] => Test Folder
                )

            [4] => Array
                (
                    [folder] => 1
                    [key] => 10
                    [title] => Testing
                )
        )
)

At first I thought this would be fairly trivial, however my solution quickly falls apart assigning the wrong parent_ids.

public function generateParentIds(array $input, $parentId = 0)
    {
        $return = [];

        foreach ($input as $key => $value) {

            if (is_array($value)) {

                $value = $this->generateParentIds($value, $parentId);

                if (isset($value['children'])) {
                    $parentId = $value['key'];
                }

                if (!is_int($key)) {
                    $return['parent_id'] = $parentId;
                }
            }

            $return[$key] = $value;
        }

        return $return;
    }

I'm not sure whats going on, I did a lot of research but couldn't find any examples, so I'd be very grateful for some help.

Upvotes: 0

Views: 97

Answers (1)

Nick
Nick

Reputation: 147216

Assuming that each child should get the immediate parent's key value as its parent_id, this should do what you want. Note that it modifies the array in place ($input is passed by reference to the function, and the foreach loop uses a reference to $child), rather than attempting to merge returned values.

function generateParentIds(&$input, $parentId = 0) {
    $input['parent_id'] = $parentId;
    if (isset($input['children'])) {
        foreach ($input['children'] as &$child) {
            generateParentIds($child, $input['key']);
        }
    }
}

generateParentIds($input);

Output is too long to show here but there's a demo at 3v4l.org

Upvotes: 1

Related Questions