0

i have an array with id and parent id and would like to turn it into a multidimentional array via the parent id. the array that i want to change as below:

    [0] => Array
        (
            [menuid] => 395
            [circuitname] => summer
            [menuname] => news
            [parentmenuid] => 0
            [displayorder] => 1
        )

    [1] => Array
        (
            [menuid] => 2
            [circuitname] => summer
            [menuname] => Introduction
            [parentmenuid] => 395
            [displayorder] => 1
        )

    [2] => Array
        (
            [menuid] => 521
            [circuitname] => summer
            [menuname] => Celebrate 100
            [parentmenuid] => 2
            [displayorder] => 2
        )
    [3] => Array
        (
            [menuid] => 80
            [circuitname] => summer
            [menuname] => hello world
            [parentmenuid] => 0
            [displayorder] => 2
        )
    [4] => Array
        (
            [menuid] => 90
            [circuitname] => winter
            [menuname] => new page
            [parentmenuid] => 0
            [displayorder] => 2
        )

there is no limit to how deep i want the hierarchy to be. i have seen examples where you can turn an array like mine into a nested html. however i just want to turn my array to a php multidimentional array.

i would like my output to look similar to this:

[0] => Array
        (
            [menuid] => 395
            [circuitname] => contact
            [menuname] => Contact Us
            [parentmenuid] => 0
            [displayorder] => 1
            [children] => Array
                (
                    [0] => Array
                        (
                            [menuid] => 500
                            [circuitname] => contact
                            [menuname] => Contact Us
                            [parentmenuid] => 395
                            [displayorder] => 1
                            [children] => Array
                                (
                                )

                        )

                    [1] => Array
                        (
                            [menuid] => 2
                            [circuitname] => diocese
                            [menuname] => Introduction
                            [parentmenuid] => 395
                            [displayorder] => 1
                            [children] => Array
                                (
                                )

                        )
Ahm3d
  • 129
  • 3
  • 15

1 Answers1

0

You could separate first the parents, after separating them, you could use foreach then to reunite the remaining children to their respective parents. Consider this example:

$raw_values = array( array( 'menuid' => 395, 'circuitname' => 'summer', 'menuname' => 'news', 'parentmenuid' => 0, 'displayorder' => 1, ), array( 'menuid' => 2, 'circuitname' => 'summer',     'menuname' => 'Introduction', 'parentmenuid' => 395, 'displayorder' => 1, ), array( 'menuid' => 521, 'circuitname' => 'summer', 'menuname' => 'Celebrate 100', 'parentmenuid' => 2, '    displayorder' => 2, ), array( 'menuid' => 80, 'circuitname' => 'summer', 'menuname' => 'hello world', 'parentmenuid' => 0, 'displayorder' => 2, ), array( 'menuid' => 90, 'circuitname'     => 'winter', 'menuname' => 'new page', 'parentmenuid' => 0, 'displayorder' => 2, ),);
// get the parents first
$parents = array();
foreach($raw_values as $key => $value) {
    if($value['parentmenuid'] == 0) {
        $parents[$value['menuid']] = $value;
        unset($raw_values[$key]);
    }
}

// then reunite them to their children
foreach($raw_values as $key => $value) {
    $parents[$value['parentmenuid']]['children'][] = $value;
}

echo '<pre>';
print_r($parents);
echo '</pre>';

Sample Fiddle

user1978142
  • 7,946
  • 3
  • 17
  • 20