If I iterate through an array twice, once by reference and then by value, PHP will overwrite the last value in the array if I use the same variable name for each loop. This is best illustrated through an example:
$array = range(1,5);
foreach($array as &$element)
{
$element *= 2;
}
print_r($array);
foreach($array as $element) { }
print_r($array);
Output:
Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 10 )
Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 8 )
Note that I am not looking for a fix, I am looking to understand why this is happening. Also note that it does not happen if the variable names in each loop are not each called $element, so I’m guessing it has to do with $element still being in scope and a reference after the end of the first loop.
After the first loop $element is still a reference to the last element/value of $array.
You can see that when you use var_dump() instead of print_r()
Note that & in
&int(2).With the second loop you assign values to $element. And since it’s still a reference the value in the array is changed, too. Try it with
as the second loop and you’ll see.
So it’s more or less the same as
(only with loops and multiplication …hey, I said “more or less” ;-))