tags:

views:

184

answers:

3
$mainMenu['Home'][1] = '/mult/index.php';
$mainMenu['Map'][1] = '/mult/kar.php';
$mainMenu['MapA'][2] = '/mult/kara.php';
$mainMenu['MapB'][2] = '/mult/karb.php';
$mainMenu['Contact'][1] = '/mult/sni.php';
$mainMenu['Bla'][1] = '/mult/vid.php';


This is a menu, 1 indicates the main part, 2 indicates the sub-menu. Like:

Home
Map
-MapA
-MapB
Contat
Bla

I know how to use foreach but as far as I see it is used in 1 dimensional arrays. What I have to do in the example above?

+7  A: 

You would need to nest two foreach BUT, there is nothing about your data structure that easily indicates what is a sub-item. Map vs. MapA? I guess a human could figure that out, but you'll have to write a lot of boilerlate for your script to sort that.. Consider restructuring your data so that it more closely matches what you are trying to achieve.

Here's an example. You can probably come up with a better system, though:

$mainMenu = array(
    'Home' => '/mult/index.php',
    'Map' => array(
        '/mult/kar.php',
        array(
            'MapA' => '/mult/kara.php',
            'MapB' => '/mult/karb.php'
        )
     ),
     'Contact' => '/mult/sni.php',
     ...
);
jasonbar
+1  A: 

You nest foreach statements; Something like this should do the work.

foreach($mainMenu as $key=>$val){
    foreach($val as $k=>$v){
       if($k == 2){
         echo '-' . $key;
       }else{
          echo $key;
       }
    }
}
Sinan
+1  A: 

Foreach can just as easily be used in multi-dimensional arrays, the same way you would use a for loop.

Regardless, your approach is a little off, here's a better (but still not great) solution:

$mainMenu['Home'][1] = '/mult/index.php';
$mainMenu['Map'][1] = '/mult/kar.php';
$mainMenu['Map']['children']['MapA'] = '/mult/kara.php';
$mainMenu['Map']['children']['MapB'] = '/mult/karb.php';
$mainMenu['Contact'][1] = '/mult/sni.php';
$mainMenu['Bla'][1] = '/mult/vid.php';

foreach($mainMenu as $k => $v){
    // echo menu item
    if(isset($v['children'])){
        foreach($v['children'] as $kk => $vv){
            // echo submenu
        }
    }
}

That said, this only does 1-level of submenus. Either way, it should help you get the idea!

Alex
`$mainMenu['Map']` should have `[1]` appended to it (or some suitable key) otherwise you just stomp the value.
jasonbar
@jasonbar thanks I overlooked that
Alex