2012-10-08 35 views
1

所以,我有這樣的:添加新的索引到一個數組內的foreach

$abc = array('a','b','c'); 
foreach ($abc as $k => &$a) { 
    echo $a; 
    if ($k == 1) 
     $abc[] = 'd'; 
} 

工作的預期,通過在foreach迭代4次,給我:

abcd 

但是現在,當我有此:

$myvar = $this->someModel->return_an_array_as_result(); // returns array([0] => array('a' => 'b')) 

foreach ($myvar as $myvar_key => &$mv){ 
    $myvar[] = array('e' => 'f'); 
    var_dump($myvar); 
    if ($myvar_key == 5) die; 
} 

該foreach只運行一次。

重置內部指針時foreach如何工作的任何想法?

+0

是的,它會運行一次......你'$ myvar'返回'array([0] => array('a'=>'b'))' – Baba

+0

是的,但仔細看看第二個代碼:'$ myvar []' – dmmd

+0

查看更新的答案...它應該使用'ArrayObject' Insted – Baba

回答

1

我明白你的意思,你可以使用ArrayObject這將允許追加到數組,而你仍然遍歷數組

$myvar = new ArrayObject(array('a' => 'b')); 
$x = 0; 
foreach ($myvar as $myvar_key => $mv) { 
    $myvar->append(array('e' => 'f')); 
    if (($x >= 4)) 
     break; 
    $x ++; 
} 
var_dump($myvar); 

輸出

object(ArrayObject)[1] 
    public 'a' => string 'b' (length=1) 
    array 
     'e' => string 'f' (length=1) 
    array 
     'e' => string 'f' (length=1) 
    array 
     'e' => string 'f' (length=1) 
    array 
     'e' => string 'f' (length=1) 
    array 
     'e' => string 'f' (length=1) 
+0

不完美,因爲現在我有一個對象而不是數組來處理。但仍然是一個很好的解決方案。謝謝! :) – dmmd

+0

@jlcd'(array)$ myvar'會將它轉換爲數組..簡單,因爲 – Baba

+2

確實,'ArrayObject'實現了一個動態的Enumerable接口,它認識到'next'調用之間的變化。 +1爲另一種方法。 –

1

這是因爲foreach實際上是在一個副本陣列的工作。如果您計劃在迭代陣列時修改陣列,請使用傳統的for循環。

欲瞭解更多信息,請參閱foreach上的PHP文檔。另外,如果您想要在迭代時修改元素,則可以使用&$reference(有關此內容的更多信息也可在foreach文檔中找到)。

+0

但是第一次實現如何RK? – dmmd

+0

你並不依賴於退出的條件(在第二次迭代中已經滿足條件,添加了附錄,退出了循環)。第二個例子沒有5個元素(在循環的持續時間內也不是這樣),因爲當foreach採用快照時,它只有3個元素。而且因爲它是一個副本而不是參考,所以'foreach'在它意識到有5個元素之前會長時間退出。 –

+0

但是'$ myvar []'應該爲'$ myvar'數組添加無限的新索引,因此在某些時候應該有5個元素。發生什麼事是通過所謂的「快照」迭代一次,忽略新的位置。我找不到第一個例子和第二個例子之間的區別。 – dmmd

相關問題