2013-05-09 39 views
4

我想在使用foreach循環時向數組添加一個鍵=>值對,當添加了該值時,foreach循環需要處理新鍵= >值對。在循環期間訪問新添加的鍵=>值在關聯數組中

$array = array(
    'one' => 1, 
    'two' => 2, 
    'three' => 3 
); 

foreach($array as $key => $value) { 
    if ($key == 'three') { 
     $array['four'] = 4; 
    } else if ($key == 'four') { 
     $array['five'] = 5; 
    } 
} 

如果我在循環之後打印陣列,我希望看到所有5分千伏的,而是我只看到這一點:

Array 
(
    [one] => 1 
    [two] => 2 
    [three] => 3 
    [four] => 4 
) 

有一些方法,當我添加第四對,實際處理它,所以第五對被添加到該foreach循環內(或另一種循環?)

+3

您在循環時正在修改數組。所有投注都關閉,你處於未定義的領域。 – 2013-05-09 16:50:32

回答

4

根據PHP文檔,

作爲的foreach依賴於內部數組指針在循環內改變,可能導致意外的行爲。

您不能在foreach期間修改數組。然而,用戶發佈一個定期while循環的例子,做你所需要的:http://www.php.net/manual/en/control-structures.foreach.php#99909

我這裏

<?php 
$values = array(1 => 'a', 2 => 'b', 3 => 'c'); 
while (list($key, $value) = each($values)) { 
    echo "$key => $value \r\n"; 
    if ($key == 3) { 
     $values[4] = 'd'; 
    } 
    if ($key == 4) { 
     $values[5] = 'e'; 
    } 
} 
?> 

報告它的代碼將輸出上面:

1 =>一

2 => b

3 => C^

4 => d

5 => e

+0

正是我在找什麼,謝謝! – ProvocativePanda 2013-05-09 17:07:09

2

這是因爲PHP會在內部使用它自己的數組指針副本。您正在迭代它的原始鍵/值,而不是通過修改後的數組。

由於原來的數組包含密鑰three,第一個if語句匹配,而不是第二

另一個簡單的例子是事實,這是不是一個無限循環:

$array = array(1); 
foreach($array as $val) { 
    $array []= $val +1; 
} 

var_dump($array); 

輸出:

array(2) { 
    [0] => 
    int(1) 
    [1] => 
    int(2) 
} 

然而,PHP documentation說不MUC h:

由於foreach依靠內部數組指針在循環內改變它可能會導致意外的行爲。