0

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?

2
  • $holding[$v["line_manager_number"]]["children"][] = $v; => This line with add an element into this array $holding[$v["line_manager_number"]]["children"], I don't know what is it used for in your case ? Commented Nov 28, 2020 at 20:05
  • Why did you delete your initial question? You're asking the same thing. You could've just edited it. Commented Nov 28, 2020 at 20:10

1 Answer 1

1

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.