Multi level menu with PHP/MySQL

289

I'm trying to create dynamic multi level menus fetching the data from a MySQL DB, using PHP. I've managed to order the menu items in a php array with this format:


The problem is that I can't figure out how to output this array as HTML markup in a way that will work with n levels. I can do it with a fixed number of levels like this:

{-code-2}

But this only works for 3 levels, and I know there should be a way to solve this issue, I know I'm not the first one facing a problem with HTML output of a multidimensional array.

977

Answer

--- Array ( [1] => Array ( [id] => 1 [ubicacion] => top_a [nivel] => 1 [parent_id] => [tipo] => link [link] => http://www.google.com [titulo] => Google [alias] => google_es [children] => Array ( [3] => Array ( [id] => 3 [ubicacion] => top_a [nivel] => 2 [parent_id] => 1 [tipo] => link [link] => http://www.gmail.com [titulo] => Gmail [alias] => gmail [children] => Array ( [4] => Array ( [id] => 4 [ubicacion] => top_a [nivel] => 3 [parent_id] => 3 [tipo] => link [link] => www.inbox.gmail.com [titulo] => Inbox [alias] => inbox_gmail ) ) ) ) ) [2] => Array ( [id] => 2 [ubicacion] => top_a [nivel] => 1 [parent_id] => [tipo] => link [link] => http://www.yahoo.com [titulo] => Yahoo [alias] => yahoo ) )
974

Answer

---|||foreach($menu_array as $menu) { echo "<li><a href='{$menu['link']}'>{$menu['titulo']}</a>"; if (array_key_exists('children',$menu)) { echo "<ul>"; foreach ($menu['children'] as $child_menu) { echo "<li><a href='{$child_menu['link']}'>{$child_menu['titulo']}</a>"; if (array_key_exists('children',$child_menu)) { echo "<ul>"; foreach ($child_menu['children'] as $child2_menu) { echo "<li><a href='{$child2_menu['link']}'>{$child2_menu['titulo']}</a>"; } echo "</ul>"; } } echo "</ul>"; } echo "</li>"; }
208

Answer

Solution:

You can just use a little bit of recursion to get you to more levels.

function echo_menu($menu_array) {
    //go through each top level menu item
    foreach($menu_array as $menu) {
        echo "<li><a href='{$menu['link']}'>{$menu['titulo']}</a>";
        //see if this menu has children
        if(array_key_exists('children', $menu)) {
            echo '<ul>';
            //echo the child menu
            echo_menu($menu['children']);
            echo '</ul>';
        }
        echo '</li>';
    }
}

echo '<ul>';
echo_menu($menu_array);
echo '</ul>';

This will work for any number of child levels you'd like.

People are also looking for solutions to the problem: php - CakePHP - Additional field on Model to display list of roles

Source

Didn't find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.

Ask a Question

Write quick answer

Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.

Similar questions

Find the answer in similar questions on our website.