2013-05-09 74 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依靠内部数组指针在循环内改变它可能会导致意外的行为。