2009-05-09 21 views
28

que tiene una matriz:PHP bucle foreach través matriz multidimensional

$arr_nav = array(array("id" => "apple", 
      "url" => "apple.html", 
      "name" => "My Apple" 
     ), 
     array("id" => "orange", 
      "url" => "orange/oranges.html", 
      "name" => "View All Oranges", 
     ), 
     array("id" => "pear", 
      "url" => "pear.html", 
      "name" => "A Pear" 
     )  
); 

que me gustaría utilizar un bucle foreach para reemplazar (que sólo me permite establecer el número:

for ($row = 0; $row < 5; $row++) 

con la capacidad de mostrar una clase .first.last y para la matriz correspondiente valora

Editar

Me gustaría que los datos que se hicieron eco como:

<li id="' . $arr_nav[$row]["id"] . '"><a href="' . $v_url_root . $arr_nav[$row]["url"] . '" title="' . $arr_nav[$row]["name"] . '">"' . $arr_nav[$row]["name"] . '</a></li>' . "\r\n"; 

Muchas gracias por sus respuestas rápidas. ¡Rocas de StackOverflow!

Respuesta

32
$last = count($arr_nav) - 1; 

foreach ($arr_nav as $i => $row) 
{ 
    $isFirst = ($i == 0); 
    $isLast = ($i == $last); 

    echo ... $row['name'] ... $row['url'] ...; 
} 
+0

Muchas gracias! Utilicé: (($ isLast)? 'Class = "last-child"': '') para agregar una clase al elemento de la lista –

+1

Solución muy simple y práctica. Gracias. – janosrusiczki

+1

este es un gran hombre que funciona a la perfección. muchas gracias por compartir – Jake

2

Si se refiere a la primera y la última entrada de la matriz cuando se habla de a.first y a.last, que dice así:

foreach ($arr_nav as $inner_array) { 
    echo reset($inner_array); //apple, orange, pear 
    echo end($inner_array); //My Apple, View All Oranges, A Pear 
} 

matrices en PHP tienen un puntero interno que se puede manipular con reset, next, end. Recuperando llaves/valores trabaja con key y current, pero utilizando each podría ser mejor en muchos casos ..

+0

Disculpas por ser un poco confuso. Me gustaría que los valores se muestren como:

  • ' . $arr_nav[$row]["name"] . '
  • '. "\ r \ n"; con un cheque cada bucle - para agregar una clase al 'li' –

    +0

    esta debería ser la respuesta aceptada. mucha creatividad. !! – Akintunde007

    0
    <?php 
    $first = reset($arr_nav); // Get the first element 
    $last = end($arr_nav); // Get the last element 
    // Ensure that we have a first element and that it's an array 
    if(is_array($first)) { 
        $first['class'] = 'first'; 
    } 
    // Ensure we have a last element and that it differs from the first 
    if(is_array($last) && $last !== $first) { 
        $last['class'] = 'last'; 
    } 
    

    Ahora sólo podría hacerse eco de la clase dentro de ti html-generador. Probablemente necesite algún tipo de control para asegurarse de que la clase esté configurada o proporcione una clase vacía predeterminada a la matriz.

    5
    <?php 
    $php_multi_array = array("lang"=>"PHP", "type"=>array("c_type"=>"MULTI", "p_type"=>"ARRAY")); 
    
    //Iterate through an array declared above 
    
    foreach($php_multi_array as $key => $value) 
    { 
        if (!is_array($value)) 
        { 
         echo $key ." => ". $value ."\r\n" ; 
        } 
        else 
        { 
         echo $key ." => array(\r\n"; 
    
         foreach ($value as $key2 => $value2) 
         { 
          echo "\t". $key2 ." => ". $value2 ."\r\n"; 
         } 
    
         echo ")"; 
        } 
    } 
    ?> 
    

    SALIDA:

    lang => PHP 
    type => array( 
        c_type => MULTI 
        p_type => ARRAY 
    ) 
    

    Reference Source Code

    +0

    solo 1 nivel ... necesitamos más multidimensional – aswzen

    +0

    @aswzen puedes usar recursión como esta http://stackoverflow.com/questions/14006609/php-recursion-print-all-elements-of- a-multidimensional-array-with-keys # answer-14006639 –

    Cuestiones relacionadas