user4101645
user4101645

Reputation:

Move element from first level of array to be the child of another element

print_r($menus); gives the following output:

Array
    (
        [0] => Array
            (
                [name] => Politics
                [action] => politics
            )

        [sub_menu2] => Array
            (
                [0] => Array
                    (
                        [name] => submenu2
                        [action] => politics
                    )
                 [1] => Array
                    (
                        [name] => submenu3
                        [action] => sport
                    )

            )

    )

My expected filtered array is:

Array
    (
        [0] => Array
            (
                [name] => Politics
                [action] => politics
                [sub_menu2] => Array
               (
                 [0] => Array
                    (
                        [name] => submenu2
                        [action] => politics
                    )
                 [1] => Array
                    (
                        [name] => submenu3
                        [action] => sport
                    )

               )
            )
    )

My code is:

$filteredMenu = array();
$unique = array();
$index = 0;
$index2 = 0;
foreach ($menus as $key => $menu) {
    $pm = $menu['Menu']['name'];
    if (isset($unique[$pm])) {                
        if (!empty($menu['sub_menus']['name'])) {
            $temp = array('name' => $menu['sub_menus']['name'], 'action' => $menu['sub_menus']['action']);
            $filteredMenu[$index]['sub_menu'][] = $temp;
        }
         if(!empty($menu['sub_sub_menus']['name'])){
                 $temp = array('name' => $menu['sub_sub_menus']['name'], 'action' => $menu['sub_menus']['action']);
            $filteredMenu[$index]['sub_menu']['sub_menu2'][] = $temp;
            }
    } else {
        if ($key != 0)
            $index++;
        $unique[$pm] = 'set';
        $temp = array('name' => $pm, 'action' => $menu['Menu']['action']);
        $filteredMenu[$index]['menu'] = $temp;
        if (!empty($menu['sub_menus']['name'])) {
            $temp = array('name' => $menu['sub_menus']['name'], 'action' => $menu['sub_menus']['action']);
            $filteredMenu[$index]['sub_menu'][] = $temp;
        }
         if(!empty($menu['sub_sub_menus']['name'])){
                 $temp = array('name' => $menu['sub_sub_menus']['name'], 'action' => $menu['sub_menus']['action']);
            $filteredMenu[$index]['sub_menu']['sub_menu2'][] = $temp;
            }
    }
}

I can filter to wrap all sum menus under menu. But I can't wrap all second level sub menu under sub menu. I spent lot of time to solve but failed.

Upvotes: 1

Views: 107

Answers (1)

Lemon Kazi
Lemon Kazi

Reputation: 3311

Your php code is different from your array. From where you find

$pm = $menu['Menu']['name'];

this will display error Undefined index: Menu

I think you have to apply more condition. I don't sure apply below code. I think this will solve your problem.

$filteredMenu = array();
$unique = array();
$index = 0;
$index2 = 0;
foreach ($menus as $key => $menu) {
  $pm = $menu['Menu']['name'];
$pm1 = $menu['sub_menus']['name'];
if (isset($unique[$pm])) {                
    if (!empty($menu['sub_menus']['name'])) {
        $temp = array('name' => $menu['sub_menus']['name'], 'action' => $menu['sub_menus']['action']);
        $filteredMenu[$index]['menu']['sub_menu'][] = $temp;
    }
     if(!empty($menu['sub_sub_menus']['name'])){
             $temp = array('name' => $menu['sub_sub_menus']['name'], 'action' => $menu['sub_menus']['action']);
        $filteredMenu[$index]['menu']['sub_menu']['sub_menu2'][] = $temp;
        }
} else {
    if ($key != 0)
        $index++;
    $unique[$pm] = 'set';

    $temp = array('name' => $pm, 'action' => $menu['Menu']['action']);
    $filteredMenu[$index]['menu'] = $temp;

    if (!empty($menu['sub_menus']['name'])) {
        $temp = array('name' => $menu['sub_menus']['name'], 'action' => $menu['sub_menus']['action']);
        $filteredMenu[$index]['menu']['sub_menu'][] = $temp;
    }
     if(!empty($menu['sub_sub_menus']['name'])){
             $temp = array('name' => $menu['sub_sub_menus']['name'], 'action' => $menu['sub_menus']['action']);
        $filteredMenu[$index]['menu']['sub_menu']['sub_menu2'][] = $temp;
        }

}
}

Upvotes: 1

Related Questions