pee2pee
pee2pee

Reputation: 3792

PHP: Looping through array doesn't update values in array as expected

I have the following array. What I would like is a hierarchical array so that the person at the top (level 0) will have a new key called "children" with everyone that reports to them (based off line_manager_number)

Array
(
    [58175] => Array
        (
            [number] => 58175
            [level] => 0
            [name] => Adam
            [line_manager_number] => 57900
        )

    [58202] => Array
        (
            [level] => 1
            [name] => Brian
            [line_manager_number] => 58175
        )

    [57127] => Array
        (
            [level] => 1
            [name] => Claire
            [line_manager_number] => 58175
        )

    [50136] => Array
        (
            [level] => 1
            [name] => David
            [line_manager_number] => 58175
        )

    [52862] => Array
        (
            [level] => 1
            [name] => Edward
            [line_manager_number] => 58175
        )

    [54975] => Array
        (
            [level] => 1
            [name] => Fred
            [line_manager_number] => 58175
        )

    [50164] => Array
        (
            [level] => 1
            [name] => Gail
            [line_manager_number] => 58175
        )

    [51970] => Array
        (
            [level] => 1
            [name] => Helen
            [line_manager_number] => 58175
        )

    [54648] => Array
        (
            [level] => 2
            [name] => India
            [line_manager_number] => 50136
        )

    [51306] => Array
        (
            [level] => 2
            [name] => Jane
            [line_manager_number] => 50136
        )

    [55819] => Array
        (
            [level] => 2
            [name] => Karen
            [line_manager_number] => 50136
        )

    [54963] => Array
        (
            [level] => 2
            [name] => Larry
            [line_manager_number] => 52862
        )

    [55252] => Array
        (
            [level] => 2
            [name] => Mike
            [line_manager_number] => 52862
        )

    [57774] => Array
        (
            [level] => 2
            [name] => Nigel
            [line_manager_number] => 52862
        )

    [57660] => Array
        (
            [level] => 2
            [name] => Ora
            [line_manager_number] => 52862
        )

    [9764] => Array
        (
            [level] => 2
            [name] => Peter
            [line_manager_number] => 54975
        )

    [54168] => Array
        (
            [level] => 2
            [name] => Qatar
            [line_manager_number] => 54975
        )

    [58192] => Array
        (
            [level] => 2
            [name] => Roger
            [line_manager_number] => 54975
        )

    [56098] => Array
        (
            [level] => 2
            [name] => Sandy
            [line_manager_number] => 54975
        )

    [54649] => Array
        (
            [level] => 2
            [name] => Trevor
            [line_manager_number] => 54975
        )

    [N9712] => Array
        (
            [level] => 2
            [name] => Una
            [line_manager_number] => 51970
        )

    [53360] => Array
        (
            [level] => 3
            [name] => Veronica
            [line_manager_number] => 54963
        )

    [57406] => Array
        (
            [level] => 3
            [name] => Wes
            [line_manager_number] => 54963
        )

    [60506] => Array
        (
            [level] => 3
            [name] => Xavier
            [line_manager_number] => 54963
        )

)

So for example, the start of the Array I want would look like this:

Array
(
    [58175] => Array
        (
            [number] => 58175
            [level] => 0
            [name] => Adam
            [line_manager_number] => 57900
            [children] => Array
                (
                    [0] => Array
                        (
                            [level] => 1
                            [name] => Brian
                            [line_manager_number] => 58175
                        )

                    [1] => Array
                        (
                            [level] => 1
                            [name] => Claire
                            [line_manager_number] => 58175
                        )

                    [2] => Array
                        (
                            [level] => 1
                            [name] => David
                            [line_manager_number] => 58175
                        )

                    [3] => Array
                        (
                            [level] => 1
                            [name] => Edward
                            [line_manager_number] => 58175
                        )

                    [4] => Array
                        (
                            [level] => 1
                            [name] => Fred
                            [line_manager_number] => 58175
                        )

                    [5] => Array
                        (
                            [level] => 1
                            [name] => Gail
                            [line_manager_number] => 58175
                        )

                    [6] => Array
                        (
                            [level] => 1
                            [name] => Helen
                            [line_manager_number] => 58175
                        )

                )

        )

Then for each child, it would list their direct reports and so on.

I've tried and tried to get this right to no avail. I have tried the following

$a =  array_reverse($holding, true); 
foreach ($a as $k=>$v) {
    $holding[$v["line_manager_number"]]["children"][] = $v;
}

I reversed the array as the lowest in the hierarchy would always be last and I can then unset (not done here) each key until I get to the top of the tree.

This doesn't work as expected. So it will provide the example above but it won't go any deeper. It's only ever one level deep.

Any advice?

Upvotes: 0

Views: 55

Answers (1)

Nigel Ren
Nigel Ren

Reputation: 57121

The problem is that when you add the new item back into the hierarchy, you always add the original contents (from the array copy $a) and not the manipulated original array ($holding).

If you try

$holding[$v["line_manager_number"]]["children"][] = $holding[$k];

this should add in the full array levels back in.

Upvotes: 1

Related Questions