The first
foreach loop does not make any change to the array, just as we would expect.
However, it does cause $v
to be assigned a reference to each of $a
’s elements,
so that, by the time the first loop is over, $v
is, in fact, a reference to $a[2]
.
As soon as the second loop starts, $v
is now assigned the value of each
element. However, $v
is already a reference to $a[2];
therefore, any value
assigned to it will be copied automatically into the last element of the array!
Thus, during the first iteration, $a[2]
will become zero, then one, and then
one again, being effectively copied on to itself. To solve this problem, you
should always unset the variables you use in your by-reference foreach
loops—or, better yet, avoid using the former altogether.