我正在尝试在使用foreach循环时向数组添加key =>值对,当添加该值时,foreach循环需要处理新的key =>值对。
$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循环中添加第五对(或另一种循环?)
答案 0 :(得分: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 =&gt;一个
2 =&gt; b
3 =&gt; c
4 =&gt; d
5 =&gt; ë
答案 1 :(得分: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依赖于内部数组指针,因此在循环内更改它可能会导致意外行为。