techhunter
techhunter

Reputation: 400

Create multi level menus from dynamic two dimensional arrays

I am trying to create multi level menus from the following output from mysql table and php.

This is my code:

    $data['menu_response'] = $this->mmenus->getAllMenus($mem_id);

    $array = array();
    $sub_array = array();

    foreach ($data['menu_response'] as $v1) {
        $array[] = $v1->MenuName;
        $sub_array[] = $v1->SubMenuName;
        //print_r($v1->SubMenuName . "</br>");
        //print_r($v1->MenuName . "</br>");
    }

    print_r($array);
    print_r($sub_array);

I am getting the printed output as

Array ( [0] => News [1] => News [2] => News [3] => Video [4] => Video [5] => Audio ) Array ( [0] => All [1] => Summary [2] => Preview [3] => Summary [4] => Preview [5] => Summary )

Here first array is the parent array and the second array is the child array.

The db query is :

SELECT prm_members_menus.id, prm_linked_menus.menuLinkedID,prm_linked_menus.menuID, prm_linked_menus.SubMenuID, (SELECT prm_menus.name from prm_menus where prm_menus.id = prm_linked_menus.menuID) as MenuName , (SELECT prm_sub_menus.name from prm_sub_menus where prm_sub_menus.subMenuID = prm_linked_menus.subMenuID) as SubMenuName from prm_members_menus inner join prm_linked_menus on prm_linked_menus.menuLinkedID = prm_members_menus.menuLinkedID WHERE prm_members_menus.mem_id=2 order by prm_members_menus.id

How multi-level menu can be generated from the above output for common parent?

I am building dynamic navigation menu for different type of users for my web application. I want to display the navigation menu for

**MEMBER_ID 1:**

NEWS

    -- ALL

    -- PREVIEW

    -- SUMMARY

AUDIO

    -- PREVIEW 

VIDEO

    -- ALL

**MEMBER_ID 2:**

NEWS

    -- ALL

    -- PREVIEW

AUDIO

    -- PREVIEW 

VIDEO

    -- ALL



**MEMBER_ID 3:**

AUDIO

    -- PREVIEW 

VIDEO

    -- ALL

I have been trying several hours to populate MULTI-LEVEL NAVIGATION MENU LIST using the above database table structures. I am trying to populate dynamic menu-list and it's href, icon using FOREACH LOOP and have coded in codeigniter and mysql.

Darren has helped to generate the parent, sub menu list.

Now the next problem to change the Menu, SubMenu href, icon dynamically from the returned query along with the MenuName, SubMenuName. How can it be achieved?

<<<

the PHP output of the mysql query:

  Array ( [0] => stdClass Object ( [id] => 10 [menuLinkedID] => 1 [menuID] => 2 [SubMenuID] => 1 [MenuName] => News [SubMenuName] => All ) [1] => stdClass Object ( [id] => 11 [menuLinkedID] => 2 [menuID] => 2 [SubMenuID] => 2 [MenuName] => News [SubMenuName] => Summary ) [2] => stdClass Object ( [id] => 12 [menuLinkedID] => 3 [menuID] => 2 [SubMenuID] => 3 [MenuName] => News [SubMenuName] => Preview ) [3] => stdClass Object ( [id] => 14 [menuLinkedID] => 5 [menuID] => 3 [SubMenuID] => 2 [MenuName] => Video [SubMenuName] => Summary ) [4] => stdClass Object ( [id] => 15 [menuLinkedID] => 6 [menuID] => 3 [SubMenuID] => 3 [MenuName] => Video [SubMenuName] => Preview ) [5] => stdClass Object ( [id] => 17 [menuLinkedID] => 8 [menuID] => 4 [SubMenuID] => 2 [MenuName] => Audio [SubMenuName] => Summary ) )

the UPDATED PHP output of the query to fetch MenuName, SubMenuName, href, icon :

THE QUERY IS: ...............

SELECT prm_members_menus.id, prm_linked_menus.menuLinkedID,prm_linked_menus.menuID, prm_linked_menus.SubMenuID, prm_menus.href as parent_href,prm_menus.i_class as parent_i_class,prm_sub_menus.href as child_href,prm_sub_menus.i_class as child_i_class, (SELECT prm_menus.name from prm_menus where prm_menus.id = prm_linked_menus.menuID) as MenuName , (SELECT prm_sub_menus.name from prm_sub_menus where prm_sub_menus.subMenuID = prm_linked_menus.subMenuID) as SubMenuName from prm_members_menus inner join prm_linked_menus on prm_linked_menus.menuLinkedID = prm_members_menus.menuLinkedID inner join prm_menus on prm_menus.id = prm_linked_menus.menuID inner join prm_sub_menus on prm_sub_menus.subMenuID = prm_linked_menus.subMenuID WHERE prm_members_menus.mem_id= 2 order by prm_members_menus.id

OUTPUT IS: ..............

  Array ( [0] => stdClass Object ( [id] => 1 [menuLinkedID] => 1 [menuID] => 2 [SubMenuID] => 1 [parent_href] => news [parent_i_class] => fa fa-list-alt [child_href] => all [child_i_class] => fa fa-folder-o [MenuName] => News [SubMenuName] => All ) [1] => stdClass Object ( [id] => 2 [menuLinkedID] => 2 [menuID] => 2 [SubMenuID] => 2 [parent_href] => news [parent_i_class] => fa fa-list-alt [child_href] => summary [child_i_class] => fa fa-folder-o [MenuName] => News [SubMenuName] => Summary ) [2] => stdClass Object ( [id] => 3 [menuLinkedID] => 3 [menuID] => 2 [SubMenuID] => 3 [parent_href] => news [parent_i_class] => fa fa-list-alt [child_href] => preview [child_i_class] => fa fa-folder-o [MenuName] => News [SubMenuName] => Preview ) [3] => stdClass Object ( [id] => 4 [menuLinkedID] => 4 [menuID] => 3 [SubMenuID] => 1 [parent_href] => video [parent_i_class] => fa fa-eye [child_href] => all [child_i_class] => fa fa-folder-o [MenuName] => Video [SubMenuName] => All ) [4] => stdClass Object ( [id] => 5 [menuLinkedID] => 6 [menuID] => 3 [SubMenuID] => 3 [parent_href] => video [parent_i_class] => fa fa-eye [child_href] => preview [child_i_class] => fa fa-folder-o [MenuName] => Video [SubMenuName] => Preview ) [5] => stdClass Object ( [id] => 6 [menuLinkedID] => 7 [menuID] => 4 [SubMenuID] => 1 [parent_href] => audio [parent_i_class] => fa fa-folder-o [child_href] => all [child_i_class] => fa fa-folder-o [MenuName] => Audio [SubMenuName] => All ) [6] => stdClass Object ( [id] => 7 [menuLinkedID] => 8 [menuID] => 4 [SubMenuID] => 2 [parent_href] => audio [parent_i_class] => fa fa-folder-o [child_href] => summary [child_i_class] => fa fa-folder-o [MenuName] => Audio [SubMenuName] => Summary ) [7] => stdClass Object ( [id] => 8 [menuLinkedID] => 9 [menuID] => 4 [SubMenuID] => 3 [parent_href] => audio [parent_i_class] => fa fa-folder-o [child_href] => preview [child_i_class] => fa fa-folder-o [MenuName] => Audio [SubMenuName] => Preview ) )

Upvotes: 0

Views: 2718

Answers (2)

Darren
Darren

Reputation: 13128

I don't see why you're seperating the Parent level menu and the sub menu, how do you know which sub menus belong to which menu?

You should change your menu assigning to something like this:

$menu = array();
foreach ($data['menu_response'] as $v1) {
    $menu[$v1->MenuName][] = $v1->SubMenuName;
}

Which would technically give you something like:

Array (
    [Menu-item] => Array(
        [0] => [Sub-menu-item],
        [2] => [Sub-menu-item],
    )
.....etc
)

That way you can just simply loop through the $menu array and print it out in the structure you want.

Example:

echo "<ul>";
foreach($menu as $title => $submenu) {
    echo "<li>";
    echo $title;
    if(!empty($submenu)) {
        echo "<ul>";
        foreach($submenu as $item) {
            echo "<li>{$item}</li>";
        }
        echo "</ul>";
    }
    echo "<li>";
}
echo "</ul>";

Updated answer: You'd just create an associative array like I stated in the comments :) A simple loop like this should do:

$menu = array();
foreach ($data['menu_response'] as $v1) {
    $menu[$v1->MenuName][] = array('submenu' => $v1->SubMenuName, 'icon' => $v1->child_i_class);
}

And you can print that out like this:

echo "<ul>";
foreach($menu as $title => $submenu) {
    echo "<li>";
    echo $title;
    if(!empty($submenu)) {
        echo "<ul>";
        foreach($submenu as $item) {
            echo "<li><i class='{$item['icon']}'></i> {$item['submenu']}</li>";
        }
        echo "</ul>";
    }
    echo "<li>";
}
echo "</ul>";

Upvotes: 1

airtech
airtech

Reputation: 496

Will this work for ya?

Don't know if you need to create a multidimensional array that you want to print later (aka the reason for $array and $sub_array) or if you just need to display it out. My assumption is based on your question, you just need to display it and this is a good answer for you.

$MenuName = "";
foreach ($data['menu_response'] as $v1) {
    if ($v1->MenuName != $MenuName) {
        // New Main Menu Line
        if ($MenuName != "") {
            echo "</ul>";
        }
        echo "<ul>";
        $MenuName = $v1->MenuName;
        print_main_menu($v1->MenuName);
    }
    print_sub_main_menu($v1->SubMenuName, $v1->menuLinkedID);
}
if ($MenuName != "") {
    echo "</ul>";

print_main_menu($Text) {
    echo "<li>$Text</li>";
}

print_sub_menu($Text, $MenuId) {
    echo "<li><a href=$MenuId>$Text</a></li>";
}

Editted to show example of how to append HTML to the items.

Upvotes: 1

Related Questions