php中”怪异”的循环

On 六月 9, 2011, in 技术记录, by pensz

前不久在打酱油的时候发现了一个诡异的问题,遍历php数组,竟然结果有问题。具体就是最后一个元素的值和倒数第二个元素的值一样。最后打算去bugs.php.net上搜索一下是不是真的是bug,结果不是bug,有人也报告了这个问题,具体地址请移步至 http://bugs.php.net/bug.php?id=50582 。

问题代码:

Reproduce code:
---------------
$ii = array(1, 2, 3);
foreach ($ii as &$i) echo $i;
foreach ($ii as $i) echo $i;

Expected result:
----------------
123123

Actual result:
--------------
123122

rasmus的解释如下:

It doesn't act weird.  There is no block scope in PHP, so at the end of
the first loop $i is a reference to the last element of $ii and in the
second loop you are now assigning values to that reference which means
you are overwriting the 3rd element of $ii each time through the loop.
That of course means that once you get to the 3rd element of $ii it is
no longer 3 and you see the last value assigned to it, which was 2.

意思就是说:php中没有块作用域,故变量 $i 的作用域不仅仅存在于第一个循环,而是存在与整个代码中,经过第一个循环后,$i 为 $ii最后一个元素的引用;第二个循环的作用就是不断将当前数组中各个元素的值赋值给$ii的最后一个元素,故最后一个元素的值为倒数第二个元素的值。

解决方法就是:

1 第二个循环中不用 $i

2 第一个循环结束后 unset($i)

Tagged with: