How to use PHP’s foreach construct to loop through PHP array elements.
Often you need to move through all the elements in a PHP array so that you can do something with each element’s value. For example, you may want to display each value in an HTML table, or give each element a new value.
In Counting PHP Array Elements Using count(), I showed how you can use a for loop along with thecount() function to loop through an array. However, there’s a much easier way to loop through arrays: theforeach construct.
In this article you learn the basic syntax of foreach, and see how to use it to loop through both indexed and associative arrays.

Looping through element values

The simplest way to use foreach is when looping through the values in an indexed array. Here’s the basic syntax:
foreach ( $array as $value ) {
  // Do stuff with $value
}
 
// This code runs after the loop finishes
For example, the following script loops through a list of movie directors in an indexed array, displaying each director’s name as it goes:
<?php

$directors = array( "Alfred Hitchcock", "Stanley Kubrick", "Martin Scorsese", "Fritz Lang" );

foreach ( $directors as $director ) {
echo $director . "<br />";
}
?>

The above script produces the following output:
Alfred Hitchcock
Stanley Kubrick
Martin Scorsese
Fritz Lang

Looping through keys and values

So far so good, but what about associative arrays? With these types of arrays, you often want to access each element’s key as well as its value. Luckily, foreach gives you a way to do just that:
foreach ( $array as $key => $value ) {
  // Do stuff with $key and/or $value
}
 
// This code runs after the loop finishes
Here’s an example that loops through an associative array of movie information, displaying each element’s key and value inside an HTML definition list:
<?php

$movie = array( "title" => "Rear Window",
"director" => "Alfred Hitchcock",
"year" => 1954,
"minutes" => 112 );

echo "<dl>";

foreach ( $movie as $key => $value ) {
echo "<dt>$key:</dt>";
echo "<dd>$value</dd>";
}

echo "</dl>";

?>

This script displays the following:
title:
    Rear Window
director:
    Alfred Hitchcock
year:
    1954
minutes:
    112

Altering element values

So far you’ve just looked at reading element values, but what if you want to change values as you loop through? You might try something like this:
<?php

foreach ( $myArray as $value ) {
$value = 123;
}

?>

However, if you do this you’ll find that your array values aren’t changed. This is because foreach works on acopy of the array values, rather than the original array. So the original array remains untouched.
To change array values, you need to reference the values. You do this by placing an ampersand (&) before the value variable in the foreach construct:
<?php

foreach ( $myArray as &$value ) {
$value = 123;
}

?>

$value then becomes a reference to the element value in the original array, which means you can change the element by assigning a new value to $value.
reference is a pointer to the original value, rather than a copy of the value. It’s a bit like a shortcut in Windows, or an alias in Mac OS.
For example, the following script loops through each director in the $directors array, and uses PHP’sexplode() function and list construct to reverse the director’s first and last names:
<?php

$directors = array( "Alfred Hitchcock", "Stanley Kubrick", "Martin Scorsese", "Fritz Lang" );

// Change the name format for each element to "last, first"
foreach ( $directors as &$director ) {
list( $firstName, $lastName ) = explode( " ", $director );
$director = "$lastName, $firstName";
}

unset( $director );

// Output the final array
foreach ( $directors as $director ) {
echo $director . "<br />";
}
?>

This script outputs the following:
Hitchcock, Alfred
Kubrick, Stanley
Scorsese, Martin
Lang, Fritz
Notice that the script calls unset() to delete the $director variable after it’s been used as a reference in the first loop. This is always a good idea if you think you might want to use the variable later in the script in a different context.
If you don’t delete the reference then you run the risk of accidentally referencing the last element in the array (“Lang, Fritz”) when you next use the $director  variable, with often quite unexpected consequences!
Note: In case you’re wondering, you can only change array <em>values</em> in a foreach loop. You can’t change array keys

0 comments:

Post a Comment

 
Top
Blogger Template