On 2009-10-21, at 10:40 PM, Richard K Miller wrote:
I don't follow. Is this really the intended behavior? It seems quite
unintuitive that the original array would be modified by *empty*
loops.
It is intended behaviour. Consider your code; at the end of this loop:
$items = array('apple', 'banana', 'carrot');
print_r($items);
foreach ($items as &$item) { }
$item will contain a reference to the last item of $items. Therefore,
when you start the next loop:
foreach ($items as $item) { }
$item will receive each of the values stored in $items, in sequence.
But $item is a reference to the last item in $items, so whatever you
write into it will also be written into the last item of the array.
Thus, the loop will cause these values to be written there:
- On the first iteration, "apple"
- On the second iteration, "banana"
- On the third iteration, "banana" (because you are taking the third
item in the array, which you just overwrote)
When would this behavior be desired?
Probably never, but that does not make it counterintuitive—the
interpreter is behaving correctly based on the data it is handling and
the instructions you are giving to it. The correct solution, as
someone has already recommended, is to unset the iterator if you want
to reuse it.
Cheers,
Marco.