On Sat, Jan 7, 2012 at 5:01 PM, Tim Behrendsen <tim@xxxxxxxxxxxxxx> wrote: > The first loop is leaving a reference to the final element. But then the > second foreach is doing a straight assignment to the $row variable, but > $row is a reference to the final element. So the foreach is assigning its > iterated value to the final element of the array, instead of a normal > variable. > Exactly, and the fact that it shows "1, 2, 2" in the second loop adds more confusion, but it makes sense. In the second loop, it assigns the indexed row value into the third row and displays it. Thus it displays row 1, row 2, and then ... row 3, but row 3 is the one that keeps getting overwritten. And in the third iteration, it overwrites the third row with the third row which currently holds what was in row 2. The moral is always unset the iterator variable when doing foreach with a > reference, like the manual says. :) > While you can certainly follow the above advice, in my view it's dangerous to have these two loops a) reuse the same variable name for a different purpose and b) exist in the same scope. More and more I find myself dropping the subtle tricks I've learned over the years in favor of writing code that is as easy to understand as possible. Code gets read and modified a lot more than it gets written, and all those tricks just trip up more junior teammates--and often even myself. :) David