Using numeric indexes doesn't automatically sort your array.
<?php
$titles[3] = 'three';
$titles[2] = 'two';
$titles[1] = 'one';
print_r( $titles);
foreach ($titles as $t ) {
print "title=$t ";
}
?>
will display:
Array ( [3] => three [2] => two [1] => one )
title=three title=two title=one
If you want the items coming out in the correct order you need to use sort
<?php
sort($titles);
print_r($titles);
?>
Array ( [0] => one [1] => three [2] => two )
foreach
PHP 4 (maar PHP 3 niet) heeft een foreach construct, dat veel op die van PERL en sommige andere talen lijkt. Dit construct geeft een makkelijke manier om door een array te lopen. Er zijn twee syntaxes, de tweede is een kleine, maar handige, uitbreiding op de eerste:
foreach(array_expressie as $waarde) statement
foreach(array_expressie as $key => $waarde) statement
De eerste vorm loopt door de array, aangegeven met array_expressie. In elke iteratie wordt de waarde van het huidige element in $waarde geplaatst en wordt de interne array pointer één positie verder gezet (zodat in de volgende iteratie het volgende element wordt opgehaald).
De tweede vorm werkt precies zo, alleen zal de key van het element ook nog eens aan de variabele $key gekoppeld.
Note: Als foreach begint met het doorlopen van de array, dan wordt de interne array pointer automatisch gereset naar het eerste element van de array. Dit betekend dat je niet eerst reset() hoeft te gebruiken voor een foreach loop.
Note: Also note that foreach operates on a copy of the specified array, not the array itself, therefore the array pointer is not modified as with the each() construct and changes to the array element returned are not reflected in the original array.
Note: foreach does not support the ability to suppress error messages using '@'.
De volgende twee voorbeelden zijn functioneel identiek aan elkaar:
reset ($arr);
while (list(, $value) = each ($arr)) {
echo "Waarde: $value<br>\n";
}
foreach ($arr as $value) {
echo "Waarde: $value<br>\n";
}
reset ($arr);
while (list($key, $value) = each ($arr)) {
echo "Key: $key; Waarde: $value<br>\n";
}
foreach ($arr as $key => $value) {
echo "Key: $key; Waarde: $value<br>\n";
}
Hier volgen nog wat meer voorbeelden van het gebruik van deze functie:
/* foreach voorbeeld 1: alleen de waarde */
$a = array (1, 2, 3, 17);
foreach ($a as $v) {
print "Huidige waarde van \$a: $v.\n";
}
/* foreach voorbeeld 2: waarde (samen met de key ter illustratie) */
$a = array (1, 2, 3, 17);
$i = 0; /* alleen ter illustratie */
foreach($a as $v) {
print "\$a[$i] => $k.\n";
}
/* foreach voorbeeld 3: key en waarde */
$a = array (
"een" => 1,
"twee" => 2,
"drie" => 3,
"zeventien" => 17
);
foreach($a as $k => $v) {
print "\$a[$k] => $v.\n";
}
foreach
04-May-2009 05:21
24-Apr-2009 06:13
You may want to do something different on the last iteration through a foreach loop. For instance, if you're printing a series of HTML list elements, you may want to add a class like 'last' to the final <li> element.
I had trouble finding a good way to do this with a foreach loop. The following code illustrates the method I worked out.
<?php
$array = array('apples','bananas','cranberries','durians');
$last_item = end($array);
foreach($array as $item) {
if ($item == $last_item) {
print "I like to eat " . $item;
}
}
?>
The foreach loop outputs: 'I like to eat durians'.
Technically, you could just use if ($item == end($array)), but I assume that would require more processing time.
19-Apr-2009 05:03
Note that foreach() iterates through an array in the same order that its elements were defined. If you want to iterate through an array in a different order, you will need to sort the array prior to entering the loop.
For example:
<?php
// Iterate through an array in reverse order,
// maintaining key association (i.e. for associative arrays)
foreach(array_reverse($array, true) as $key=>$value)
{
. . .
}
?>
09-Apr-2009 09:50
Here's an example where one can loop through two or more arrays in one loop. this example has two arrays.
<?php
$array1=array("a", "b", "c");
$array2=array("1", "2", "3");
foreach(array_merge($array1, $array2) as $value)
{
echo $value;
}
// abc123
?>
For more arrays just add them as additional arguments to the array_merge function. This example isn't very useful if your loop needs to return the keys for numeric indexed arrays. For associative arrays you can return the key however must be certain that all the indexes are unique across all arrays.
29-Mar-2009 05:46
Appearently numerical keys are casted to int when looping with foreach.
Example:
<?php
$arr = array('10'=>'lol');
foreach ($arr as $k=>$v) {
var_dump($k);
}
?>
Output: int(10).
This came unexpected to me.
29-Jan-2009 10:44
foreach and the while/list/each methods are not completely identical, and there are occasions where one way is beneficial over the other.
<?php
$arr = array(1,2,3,4,5,6,7,8,9);
foreach($arr as $key=>$value)
{
unset($arr[$key + 1]);
echo $value . PHP_EOL;
}
?>
Output:
1 2 3 4 5 6 7 8 9
<?php
$arr = array(1,2,3,4,5,6,7,8,9);
while (list($key, $value) = each($arr))
{
unset($arr[$key + 1]);
echo $value . PHP_EOL;
}
?>
Output:
1 3 5 7 9
[EDIT BY danbrown AT php DOT net: Contains a typofix by (scissor AT phplabs DOT pl) on 30-JAN-2009.]
06-Nov-2008 05:36
Here is a way to declare global variable variables using a function.
This particular example handles an array that contains names of $_POST items. This is to avoid the notices that php gives when checking an unused $_POST.
<?php
function check ($inputs) {
foreach ($inputs as $input) {
global $$input;
$$input = isset($_POST[$input]) ? $_POST[$input] : "";
}
}
?>
26-Sep-2008 01:51
It should be noted that when using foreach to pass an array's key ($key => $value), the key must be a string and not binary content - containing 0's, f.e., as was my case when i used foreach to parse bencoded data handed back to me from a bittorrent tracker scraping - as this will throw foreach off and hand you a key that is binary different than the actual content of the array.
17-Sep-2008 10:22
If you use foreach with references, don't forget to unset the reference if you are not sure that a later piece of code doesn't use the same variable name. Example:
<?php
$latest_tutorials = $db->queryAll("select * from tutorials"...);
foreach ($latest_tutorials as &$tut)
$tut["comments"] = $db->queryOne("select count(*) ...");
// ...
$tut = $db->queryRow("...");
print_tutorials($latest_tutorials);
print_tutorial($tut);
?>
Here the last entry of latest_tutorials will be replaced by the row that is fetched by the $tut = $db->queryRow("..."); line because $tut is still referencing the last array entry. Solution:
<?php
foreach ($latest_tutorials as &$tut)
$tut["comments"] = $db->queryOne("select count(*) ...");
unset($tut);
// ...
$tut = $db->queryRow("...");
?>
15-Aug-2008 03:15
A common problem is having PHP generate an error when trying to iterate through an array that may sometimes have no data in it. This causes PHP to generate a warning such as:
Warning: Invalid argument supplied for foreach() in test.php on line 14
You can prevent this error by type-casting the foreach variable as an array type using "(array)" before the array variable name.
<?php
// double any value whose key starts with 'b'
$arr = array('a'=>1, 'b1'=>2, 'b2'=>3, 'c'=>4, 'd'=>5);
$non_array = null;
// Normal usage with an array
print "Test 1:\n";
foreach ($arr as $key => $val) {
print "Key $key, Value $val\n";
}
// Normal usage with a non-array (undefined or otherwise empty data set)
// Outputs: Warning: Invalid argument supplied for foreach() in test.php on line 16
print "Test 2:\n";
foreach ($non_array as $key => $val) {
print "Key $key, Value $val\n";
}
// By casting the $non_array to an (array) type, it will function without error, skipping the loop
print "Test 3:\n";
foreach ((array) $non_array as $key => $val) {
print "Key $key, Value $val\n";
}
print "Done.\n";
?>
Outputs:
Test 1:
Key a, Value 1
Key b1, Value 2
Key b2, Value 3
Key c, Value 4
Key d, Value 5
Test 2:
Warning: Invalid argument supplied for foreach() in /home/bgallagher/test.php on line 16
Test 3:
Done.
08-Jun-2008 08:10
In PHP 4, foreach is broken when used on an undefined array element (see http://bugs.php.net/bug.php?id=41169 ):
<?php
$example = array();
foreach ( $example[ 'element' ] as $value ) {
}
var_dump( $example );
?>
Expected output:
array(0) {
}
Actual output:
array(1) {
["element"]=>
NULL
}
I think this is probably the least painful workaround:
<?php
$example = array();
foreach ( (array) $example[ 'element' ] as $value ) {
}
var_dump( $example );
?>
Output:
array(0) {
}
14-Apr-2008 01:45
You can also use the alternative syntax for the foreach cycle:
<?php
foreach($array as $element):
#do something
endforeach;
?>
Just thought it worth mentioning.
29-Feb-2008 01:34
Also, do not forget that foreach is not useful
if you change the value inside of the loop.
For example:
<?php
$t=array('a', 'a', 'a', 'a', 'a', 'a', 'a', '1', 'a', 'a', 'a', 'a', 'a');
foreach($t as $var=>$val)
{
$t=array();
echo "val={$val}<br>";
}
?>
is still showing the contents of the array $t.
27-Oct-2007 10:08
As stated further up the foreach is consuming a lot of memory if used within large arrays - that is - if the array consists of for instance large objects. I had a case where a foreach caused me to run out of the 256 MB memory that PHP is allowed to handle - but changing to a for() statement completly removed both memory and CPU load.
27-Aug-2007 01:37
Using the much-maligned ability of foreach to work on references rather than copies, it becomes possible to recurse indefinitely into deep arrays without the need to know beforehand how deep they go. Consider the following example (which I use to sanitize input):
<?php
// Sanitize as a function to allow recursing; original array passed by reference
function sanitize(&$array) {
foreach ($array as &$data) {
if (!is_array($data)) { // If it's not an array, clean it
$data = '\\' . $data; // addslashes(), mysql_real_escape_string() or whatever you wish to use, this is merely a simple example
}
else { // If it IS an array, call the function on it
sanitize($data);
}
}
}
// Test case
$test = array(
array(
array(
0,
1,
2
),
3,
4
),
5,
6
);
// Output
sanitize($test);
print_r($test);
/*
Output:
Array
(
[0] => Array
(
[0] => Array
(
[0] => \0
[1] => \1
[2] => \2
)
[1] => \3
[2] => \4
)
[1] => \5
[2] => \6
)
*/
?>
When first called on $test, it passes a reference to the original $test array to the sanitize function, which begins to iterate through its contents with the immediate foreach loop. Each value that is not in itself an array gets sanitized as normal, and as both the foreach loop and the function itself are acting by reference, all changes happen directly to the contents of the superglobal rather than to copies. If the value given IS an array, it then calls the same function on it. The key here is that both the function and the foreach loop work by reference, meaning that you can call the calling function while in the foreach loop and all changes are still applied to the original array, without corruption of the array pointer, as it remains intact for each level of the array. When the end of an array is reached, the function simply returns; if it was a deeper-level array, the parent function (and parent foreach loop) continue as they were; if the top-level loop ends, then the function returns to the main code, having acted on the entire array. As everything operates within the scope of the sanitize function, you even avoid the danger of leaving the last reference set, as $data is not available outside the scope of the function in which any particular loop operates. While this might sound complicated at first, the result is that by passing to foreach by reference, true indefinite recursion is possible.
02-Jul-2007 08:08
Alright, I had a little error. I had one foreach() declaration, and then another foreach() declaration.
They went:
<?php
//$connections is an array of Socket resources
foreach ($connections as $key => &$value) {
//the code here is impertinent
}
//$users is an associative array
foreach ($users as $key => &$value) {
//the code here is impertinent
}
?>
Alright, now, what error was produced as a result of this?
This one:
"Warning: Cannot use scalar value as array in filename.php on line 69."
I then realized something; the reason for this came from the fact that I used $key, and $value for both of them in the exact same way.
As a response to this, I've developed two ways to fix this:
<?php
//add this to the end of every foreach() you use
unset($key,$value)
?>
OR
Simply use different variables for each one.
Here is an obvious question to most of the readers, but it took me about two precious minutes to figure out, so I figured I will share it will you:
What will be the output of the following statement:
<?php
$data = array('1' => 'field1', '2' => 'field2');
foreach ($data as $field_index => $field_name);
{
echo "$field_name";
}
?>
Correct answer is 'field2', and not 'field1field2'. The forgotten semicolon at the foreach line does not trigger a syntax error, but php treats it as an empty statement..
and then the block is run once with the last value set into $field_name.
15-Jan-2007 04:41
Why not just do this?
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as $i => $value) {
$arr[$i] = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
?>
No need for references, so it works in both PHP4 and PHP5.
19-Dec-2006 08:12
"As of PHP 5, you can easily modify array's elements by preceding $value with &. This will assign reference instead of copying the value."
There are cases where array_walk or array_map are inadequate (conditional required) or you're just too lazy to write a function and pass values to it for use with array_map...
My solution to foreach for php 4 and 5 to modify values of an array directly:
<?php
$testarr = array("a" => 1, "b" => 2, "c" => 3, "d" => 4);
$testarr_keys = array_keys($testarr);
$testarr_values = array_values($testarr);
for ($i = 0; $i <= count($testarr) - 1; $i++) {
$testarr[$testarr_keys[$i]] = $testarr_values[$i] * 2;
}
print_r($testarr);
?>
07-Dec-2006 07:04
some useful functions for testing boolean values
<?php
$trueValues = array('1', 'true', 't', 'y', 'yes', 'vero', 'v'); //edit with locale values
$falseValues = array('0', 'false', 'f', 'n', 'no', 'falso'); //edit with locale values
function str_to_bool($str) {
foreach ($GLOBALS['trueValues'] as $value)
if (strcasecmp($str, $value) == 0)
return true;
foreach ($GLOBALS['falseValues'] as $value)
if (strcasecmp($str, $value) == 0)
return false;
return NULL;
}
function str_is_true($str) {
return (str_to_bool($str) === true);
}
function str_is_false($str) {
return str_to_bool($str) === false;
}
/* Test */
str_to_bool('false'); //return false
str_to_bool('vero'); // return true
str_to_bool('php'); //return null
str_is_true('php'); //return false
str_is_false('php'); //return false
?>
30-May-2006 07:33
To "foreach" over the characters of a string, first "preg_split" the string into an array:
<?php
$string="string";
$array = preg_split('//', $string, -1, PREG_SPLIT_NO_EMPTY);
foreach($array as $char) print($char."<br/>");
?>
This outputs:
s
t
r
i
n
g
15-Feb-2006 02:39
To comment on the foreach statement behaviour comment below: The reason for this different behaviour is that the foreach statement is equivalent to the each statement. They both make use of an internal pointer. To loop through the complete array after a change you could use the reset statement on the array.
09-Feb-2006 06:42
Dangers with References
<?php
$months = array("Jan", "Feb", "March");
foreach ($months as &$month) {
$month .= "Beep";
}
print_r($months);
foreach ($months as $month) {
printf("%s\n", $month);
}
?>
Because $month is a reference to $months[2], iterating again with the same varible name causes $months[2] to be overwritten! Oh no!
Ouput:
Array
(
[0] => JanBeep
[1] => FebBeep
[2] => MarchBeep
)
JanBeep
FebBeep
FebBeep
17-Jan-2006 10:17
Pretty weird but for future reference
<?php
//doesn't multiply the last value
foreach ($ar as &$v){
$v *= 2;
}
foreach($ar as $v){
echo $v. "<br>";
}
//works fine
foreach ($ar as &$o){
$o *= 2;
}
foreach($ar as $v){
echo $v. "<br>";
}
?>
10-Nov-2005 09:06
If you want to "look-ahead" values in an associative or non-continuous array, this might help:
<?php
$myArray = {'one'=>1,'two'=>2,'five'=>5,'three'=>3}
$all_keys = array_keys($myArray);
foreach ( $all_keys as $key_index => $key ) {
$value =& $myArray[$key];
// $all_keys[$key_index+2] gives null if we go past the array boundary - be carefull there
$value2 =& $myArray[$all_keys[$key_index+2]] ;
...
}
?>
26-Jul-2005 05:18
Using PHP5's foreach "as reference" can bite you!
Three guys in my office spent about a day chasing this one's tail, that was causing aberrant behavior in the values of elements of an array. It turns out to be a consequence of the nature of references, generally.
If you create a reference to a variable, all names for that variable (including the original) BECOME REFERENCES. To paraphrase "The Highlander," if you want a name to OWN a piece of data, "there can be only one."
To illustrate this point, consider the following code:
<?php
$f = array(
0 => array('value' => 'three'),
1 => array('value' => 'three')
);
foreach ( $f as $k => &$v ) {
$v['value'] = 'one';
}
$a = $f;
$b = $f;
$b[0]['value'] = 'two';
$b[1]['value'] = 'two';
var_dump($a, $b);
?>
Upon execution, you will find that, although you would expect $a to contain two arrays with 'value' of 'one', $a and $b are identical -- i.e., the changes of []['value'] to 'two' have happened in both arrays. But, upon further examination of the var_dumps, you will see that both sets' elements [0] and [1] are preceded with "&": they are references!
The easy solution to this problem turns out to be: unset the foreach "as-reference" variable ($v) at the bottom of your foreach loop. This allows the original variable (or array member) to resume ownership of the value and dissolves its "reference-ness".
13-Jul-2005 04:59
I use this code to do a simple cleanup on information heading from an HTML form into a database:
<?php
foreach ($_POST as $key => $value) {
$$key = addslashes(trim($value));
}
?>
30-Jun-2005 08:06
Here are various ways I've seen to iterate arrays by reference in PHP4.
Based on my tests, I have placed them in order of fastest to slowest.
Benchmarking tool I used:
http://phplens.com/phpeverywhere/phpe-2004.htm#a3297
http://phplens.com/lens/dl/JPBS.zip
<?php
// --------------------------------------------------------------------
foreach ( array_keys($myArray) as $key ) {
$element =& $myArray[$key];
...
}
// --------------------------------------------------------------------
foreach( $myArray as $key => $element ) {
$element =& $myArray[$key];
...
unset($element);
}
// --------------------------------------------------------------------
reset($myArray);
while ( list($key) = each($myArray) ) {
$element =& $myArray[$key];
...
unset($element);
}
?>
Andrew
How To Use References In Foreach Safely And Sanely In PHP 4.
There are two really really important points to remember about foreach and references:
1. foreach makes a copy
2. references (and unset!) work by directly manipulating the symbol table
In practice, this means that if you have an array of objects (or arrays) and you need to work on them *in-place* in a foreach loop, you have to do this:
<?php
foreach( $object_list as $id => $the_object ) {
$the_object = & $object_list[$id]; // Re-assign the variable to point to the real object
....
unset($the_object); // Break the link to the object so that foreach doesn't copy the next one on top of it.
}
?>
This really works. I have used it in dozens of places. Yes, you need it all, including the unset(). You will get extremely hard-to-find bugs if you leave out the unset().
Static.
21-May-2005 08:32
be aware! take the note in the manual serious: "foreach operates on a copy of the specified array"
when working with complex systems you may get memory problems because of all this copies of arrays.
i love this function (easy to use) and use it more often than "for" or "while" functions but now i have really problems on this and finally found the reason (which can be a mess to find out)!
the sum of memory usage sometimes can be *2 than you really need.
17-May-2005 06:01
I had the same problem with foreach() and a recursiv function. If you don't want to spend about 1 or 2 hours to solve this problem, just use for() loops instead of foreach().
Some Example:
<?php
$arr[] = array(1,"item1");
$arr[] = array(2,"item2");
$arr[] = array(1,"item3");
//$arr[] = ...
//doesn't work
function foo($x) {
global $arr; // some Array
foreach($arr as $value) {
if($value[0] == $x) {
echo $value[1]."\n";
foo($value[0]);
}
}
}
//just use this
function foo($x) {
global $arr; // some Array
for($i=0; $i < count($arr); $i++) {
if($arr[$i][0] == $x) {
echo $arr[$i][1]."\n";
foo($arr[$i][0]);
}
}
}
?>
Paul
07-Oct-2004 07:21
(PHP 5.0.2)
Pay attention if using the same variable for $value in both referenced and unreferenced loops.
<?php
$arr = array(1 => array(1, 2), 2 => array(1, 2), 3 => array(1, 2));
foreach($arr as &$value) { }
foreach(array(1,2,3,4,5) as $value) { }
echo $test[3];
?>
What happens here is that after the first foreach() loop, you have in $value a reference to the last element of $arr (here: array(1, 2)).
Upon entering the second foreach(), php assigns the value. Now value is assigned to where $value (which is still a reference) points, that is, the last element of $arr.
Your output will be "5", not the expected "Array". To be on the safe side, unset($value) before entering the next foreach().
18-Apr-2004 03:27
Apparently the behavior of foreach with classes changed in PHP5. Normally, foreach operates on a copy of the array. If you have something like
<?php
foreach ($array as $value){
$value = "foo";
}
?>
the original array will not be modified. However, testing this code on PHP5RC1
<?php
class foobar {
var $a;
var $b;
function foobar(){
$this->a = "foo";
$this->b = "bar";
}
}
$a = new foobar;
$b = new foobar;
$c = new foobar;
$arr = array('a' => $a, 'b' => $b, 'c' => $c);
foreach ($arr as $e){
$e->a = 'bah';
$e->b = 'blah';
}
var_dump($arr);
?>
resulted in the following output:
array(3) {
["a"]=>
object(foobar)#1 (2) {
["a"]=>
string(3) "bah"
["b"]=>
string(4) "blah"
}
["b"]=>
object(foobar)#2 (2) {
["a"]=>
string(3) "bah"
["b"]=>
string(4) "blah"
}
["c"]=>
object(foobar)#3 (2) {
["a"]=>
string(3) "bah"
["b"]=>
string(4) "blah"
}
}
It would seem that classes are actually passed by reference in foreach, or at least that methods are called on the original objects.
18-Feb-2004 06:50
There is a really really big pitfall to watch out for if you are using "foreach" and references.
Recall this example:
<?php
$a = "Hello";
$b =& $a; // $b now refers to "Hello"
$b = "Goodbye"; // BOTH $a and $b now refer to "Goodbye"
?>
This also applies to the loop variable in a foreach construct. This can be a problem if the loop variable has already been defined as a reference to something else.
For example:
<?php
// Create some objects and store them in an array
$my_objects = array();
for($a = 0; $a < $num_objects; $a++) {
$obj =& new MyObject();
$obj->doSomething();
$my_objects[] =& $obj;
}
// later on in the same function...
foreach($my_objects as $obj) { // Note that we are trying to re-use $obj as the loop variable
$obj->doSomethingElse();
}
?>
When the "for" loop exits, $obj is a reference to the last MyObject that was created, which is also the last element in the "my_objects" array.
On every iteration, the foreach loop will do the equivalent of:
<?php
$obj = $my_objects[$internal_counter++];
?>
$obj will now refer to the appropriate element in the array.
But recall the reference example at the top. Because $obj was already defined as a reference, any assignment to $obj will overwrite what $obj was referring to. So in other words, on every foreach loop iteration, the last element in the array will be overwritten with the current array element.
To avoid this problem, either use a differently named loop variable, or call "unset()" on the loop variable before you begin the foreach().
It would be more intuitive PHP unset() the loop variable before a foreach began, maybe they'll put that in a later version.
06-Feb-2004 06:05
For dual iteration, the internal pointers may need resetting if they've been previously used in a foreach.
<?PHP
for(
$someArray1.reset(),
$someArray2.reset();
list(, $someValue1 ) = each( $someArray1 ) ,
list(, $someValue2 ) = each( $someArray2 )
;
) {
echo $someValue1;
echo $someValue2;
}
?>
22-Apr-2003 08:33
[Ed Note: You can also use array_keys() so that you don't have to have the $value_copy variable --alindeman at php.net]
I use the following to modify the original values of the array:
<?php
foreach ($array as $key=>$value_copy)
{
$value =& $array[$key];
// ...
$value = 'New Value';
}
?>
01-Jan-2003 11:29
Note that foreach is faster than while! If you can replace the following:
<?php
reset($array);
while(list($key, $val) = each($array))
{
$array[$key] = $val + 1;
}
?>
...with this (although there are functional differences, but for many purposes this replacement will behave the same way)...
<?php
foreach($array as $key => $val)
{
$array[$key] = $val + 1;
}
?>
You will notice about 30% - 40% speed increase over many iterations. Might be important for those ultra-tight loops :)
"Also note that foreach operates on a copy of the specified array, not the array itself, therefore the array pointer is not modified as with the each() construct and changes to the array element returned are not reflected in the original array."
In other words, this will work (not too expected):
<?php
foreach ($array as $array) {
// ...
}
?>
While this won't:
<?php
while (list(, $array) = each($array)) {
// ...
}
?>
