2014-03-19 57 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