2011-06-09 38 views
8

该代码时产生意想不到的输出:PHP foreach语句引用:意外的行为,再利用迭代

$array=str_split("abcde"); 
foreach($array as &$item) 
    echo $item; 

echo "\n"; 
foreach($array as $item) 
    echo $item; 

输出:

abcde 
abcdd 

如果使用&$item的第二循环,一切工作正常。

我不明白这段代码会如何影响$array的内容。我可以认为隐含的unset($header)会删除最后一行,但双重dd从哪里来?

回答

11

这可以帮助:

$array=str_split("abcde"); 
foreach($array as &$item) 
    echo $item; 

var_dump($array); 

echo "\n"; 
foreach($array as $item) { 
    var_dump($array); 
    echo $item; 
} 

,你可以在最后一次迭代后看到$item$arraye)第四元素。

之后,您遍历数组,将第4个元素更改为当前的。所以在第二次循环的第一次迭代之后,它将是abcda,等到abcdd。并在最后一次迭代中,将第4个元素更改为4th,如dd

+0

谢谢。无论如何,在第一次循环后,要从第四个元素“分离”$ item? – 2011-06-09 04:13:42

+2

@lenzai:'unset($ item);'---只要您不再需要它来防止这种混淆,通常会取消设置参考变量。 – zerkms 2011-06-09 04:16:19

+0

我的错误,我认为没有设置($ item会删除$ array [4]。我想我错了。 – 2011-06-09 04:20:08