2014-04-15 56 views
1

有沒有可能以某種方式改變由foreach處理的數組?我試過這個腳本動態改變數組在foreach

$iterator = 10; 
$cat = array(1 => 'a',2 => 'b',3 => 'c'); 

foreach ($cat as $k => $c) 
{ 
    if ($iterator < 15) 
    { 
     $cat[$iterator] = $iterator; 
     $iterator++; 
    } 
    echo $c; 
} 

但它並沒有改變'foreached'數組。從的foreach輸出是

ABC

但的var_dump從的foreach後陣列是

陣列(6){[1] =>串(1)的 「a」[2 ] => string(1)「b」[3] => string(1)「c」[10] => int(10)[11] => int(11)[12] => int(12)}

這意味着10,11,12被添加到foreach cyclus中,但是foreach沒有迭代它們?有可能這樣做嗎?或者我需要做2forecs cyclus?

回答

3
<?php 
$iterator = 10; 
$cat = array(1 => 'a',2 => 'b',3 => 'c'); 

foreach ($cat as $k => &$c)//observe the '&' 
{ 
    if ($iterator < 15) 
    { 
     $cat[$iterator] = $iterator; 
     $iterator++; 
    } 
    echo $c; 
} 
?> 
3

互聯網需要更多的貓!相反,通過引用傳遞數組,你會得到所需的結果。注意循環中的&$cat

$iterator = 10; 
$cat = array(1 => 'a',2 => 'b',3 => 'c'); 

foreach($cat as $k => &$c) 
{ 
    if ($iterator < 15) 
    { 
     $cat[$iterator] = $iterator; 
     $iterator++; 
    } 
    echo $c; 
} 
+0

試圖自己運行它? http://ideone.com/GATVX4 – zerkms

+0

公頃,真的我注意到,我推後。所以急於獲得積分。 – adamS

+1

修改。我支持我以前對貓的看法 – adamS

3

其實,你不應該。因爲foreach將與數組的副本一起工作。這意味着 - 它將首先複製你的數組,然後循環。不管你是否改變原始數組 - 因爲你正在使用foreach內的副本,所以任何修改只會影響原始數組而不是循環副本。

但是 - 是的,在foreach之後你會看到你的變化原來的數組。此外,做這樣的事情沒有意義。這很難閱讀,並可能導致不可預測的結果。

一個沒有提到的重要事情。以下不會工作:

$iterator = 10; 
$cat = array(1 => 'a');//only one element; same for empty array 

foreach ($cat as $k => &$c) 
{ 
    if ($iterator < 15) 
    { 
     $cat[$iterator] = $iterator; 
     $iterator++; 
    } 
    echo $c; 
} 

的PHP如何交易 - 因爲與數組指針foreach

+1

我不明白,但上面的解決方案工作...所以我接受了我的正確答案。無論如何,我用2個foreach來解決我的問題,我發現即使在一個foreach中,我也必須檢查以及如何說,這讓所有人都難以閱讀。謝謝:) –

+0

是的。重點是 - 在改變_original_數組時沒有任何意義。無論是參考工作還是準備只有在循環後才能看到變化 –