2014-03-19 159 views
2

我不知道该怎么说。PHP 5.4 ForEach疯狂?

以下面的例子。

<? 
$arr = array('first','second','third', 'fourth'); 
foreach ($arr as $k=>&$n) { 
    $n = $n; 
} 
var_dump($arr); 
>? 

回报

array(4) { 
    [0]=> 
    string(5) "first" 
    [1]=> 
    string(6) "second" 
    [2]=> 
    string(5) "third" 
    [3]=> 
    &string(6) "fourth" 
} 

这非常有意义,为什么会什么改变呢?那么,添加第二个循环甚至没有做任何事情,就是我迷失了方向。

<? 
$arr = array('first','second','third', 'fourth'); 
foreach ($arr as $k=>&$n) { 
    $n = $n; 
} 
foreach ($arr as $k=>$n) { 
; 
} 
var_dump($arr); 
?> 

返回

array(4) { 
    [0]=> 
    string(5) "first" 
    [1]=> 
    string(6) "second" 
    [2]=> 
    string(5) "third" 
    [3]=> 
    &string(5) "third" 
} 

阵列的最后一个值已成为一样的倒数第二个。为什么?

+0

http://stackoverflow.com/questions/4969243/strange-behavior-of-foreach/4969286#4969286 –

+2

[下面是这个效果的一个很好的描述](http://schlueters.de/blog/archives /141-References-and-foreach.html)以及它为什么会在参考迭代中发生。 –

回答

7

你转$n为参考:

foreach ($arr as $k=>&$n) { 
        ^---- 

一旦PHP变量被 “引用” 这样,它STAYS一个参考,所以在你的下一个循环中:

foreach ($arr as $k=>$n) { 

$n仍然是您在第一个循环中迭代的LAST项的参考。

+0

这是一个很好的方式来说出它!谢谢。 – user1596138

0

在黑暗中刺,但也许尝试使用reset()重置阵列的内部指针?

http://www.php.net/reset

<? 
$arr = array('first','second','third', 'fourth'); 
foreach ($arr as $k=>&$n) { 
    $n = $n; 
} 

reset($arr); 
foreach ($arr as $k=>$n) { 
; 
} 

var_dump($arr); 
?> 
2

您在第一循环$ N之前有地址操作&。删除这将解决问题。

这个问题说明如下:

Why php iteration by reference returns a duplicate last record?

+0

@Jhawins你是什么意思,那是现在的确切问题。我只是在没有&的情况下运行代码,并按预期工作。 – thatidiotguy

+0

我正处于某种事情的中间。我不明白这是怎么回事,但我会读它 – user1596138

+0

我现在明白了。这很奇怪。谢谢! – user1596138