PHP foreach is by default by value and not by reference

It is a little wired for Java and .NET developer, but PHP by default returns a copy of the iterated array item when running a foreach statement.

From the official PHP site – Note: Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself. foreach has some side effects on the array pointer. Don’t rely on the array pointer during or after the foreach without resetting it.

Here is a wrong way to manipulate an item in an array:


$arr1 = array(1, 2, 3, 4);
$arr2 = array(1, 2, 3, 4);
$arr = array(arr1,arr2);
foreach ($arr as $value) {
   //add an element to the inner array 
   $value[] =  5;
}
 

The $value is a copy of the item and the changed do not affect the item in the array itself.

Java and .NET developers, like myself, scratch their head and say “why doesn’t the foreach work?” or “what doesn’t the items in the foreach change?”

the answer is you need to use the & sign to let PHP know you need a reference rather then a value.

So here is the correct way to do the same thing:


$arr1 = array(1, 2, 3, 4);
$arr2 = array(1, 2, 3, 4);
$arr = array(arr1,arr2);
foreach ($arr as &$value) {
    //add an element to the inner array 
   $value[] =  5;
}
 
Share the love...Tweet about this on TwitterShare on LinkedInShare on Google+Share on Facebook

Amir Shevat

Amir Shevat is the global Startup Outreach lead in Google Developer Relations (g.co/launch). Previously, Amir Led Google Campus Tel Aviv and was the co founder of several startups.

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *