【问题标题】:Access newly added key=>value in associative array during loop在循环期间访问关联数组中新添加的 key=>value
【发布时间】:2013-05-09 16:48:13
【问题描述】:

我正在尝试在使用 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 kv,但我只看到这个:

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

当我添加第四对时,有什么方法可以实际处理它,以便将第五对添加到该 foreach 循环(或其他类型的循环?)

【问题讨论】:

  • 您在循环数组时正在修改数组。所有赌注都已取消,您处于未定义的领域。

标签: php arrays associative-array


【解决方案1】:

根据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

【讨论】:

    【解决方案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 对此并没有说太多:

    由于 foreach 依赖于内部数组指针,在循环内更改它可能会导致意外行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      相关资源
      最近更新 更多