Foreach y matriz 2D en PHP

$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'; 

Este es un menú, 1 indica la parte principal, 2 indica el submenú. Me gusta:

Casa
Mapa
-MapA
-MapB
Contacta
Bla

Sé cómo utilizar foreach pero, por lo que veo, se usa en matrices de 1 dimensión. ¿Qué tengo que hacer en el ejemplo de arriba?

Necesitarás anidar dos foreach PERO no hay nada en tu estructura de datos que indique fácilmente qué es un subtema. Mapa frente a MapA? Supongo que un humano podría darse cuenta, pero tendrás que escribir mucho boilerlate para que tu guión lo ordene … Considera reestructurar tus datos para que coincidan más con lo que intentas lograr.

Aquí hay un ejemplo. Sin embargo, probablemente puedas idear un mejor sistema:

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

Anillas declaraciones foreach; Algo como esto debería hacer el trabajo.

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

Foreach puede usarse con la misma facilidad en matrices multidimensionales, de la misma manera que usaría un bucle for.

En cualquier caso, su enfoque es un poco desalentador, aquí hay una solución mejor (pero aún no excelente):

 $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 } } } 

Dicho esto, esto solo tiene 1 nivel de submenús. De cualquier manera, ¡debería ayudarte a tener la idea!