Friday, May 6, 2011

PHP foreach loop through multidimensional array

I have an array:

$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"
     )  
 );

Which I would like to use a foreach loop to replace (which only allows me to set the number:

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

with the ability to display a .first and .last class for the relevant array values

Edit

I would like the data to be echoed as:

<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";

Many thanks for your quick responses. StackOverflow rocks!

From stackoverflow
  • If you mean the first and last entry of the array when talking about a.first and a.last, it goes like this:

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

    arrays in PHP have an internal pointer which you can manipulate with reset, next, end. Retrieving keys/values works with key and current, but using each might be better in many cases..

  • $last = count($arr_nav) - 1;
    
    foreach ($nav_array as $i => $row)
    {
        $isFirst = ($i == 0);
        $isLast = ($i == $last);
    
        echo ... $row['name'] ... $row['url'] ...;
    }
    
    kitsched : Very simple and practical solution. Thanks.
  • <?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';
    }
    

    Now you could just echo the class inside you html-generator. Would probably need some kind of check to ensure that the class is set, or provide a default empty class to the array.

0 comments:

Post a Comment