在foreach循环中向数组添加值

12
我将尝试在foreach循环内部实时编辑一个数组。我基本上分析每个键,如果这个键与我想要的键匹配,我希望在这个键后立即添加另一个条目到数组中。
如果我采取这段代码,
$values = array(
    'foo' => 10,
    'bar' => 20,
    'baz' => 30
);

foreach($values as $key => $value){
    print $value . ' ';
    if($key == 'bar'){
        $values['qux'] = 21;
    }
}
我有两个问题, 第一个问题是输出结果为“10 20 30”,而不是预期的“10 20 30 21”。 第二个问题是,即使我解决了第一个问题,我的值仍将被添加到我的数组末尾
如何在"bar"和"baz"之间添加"qux"条目呢?
谢谢您的建议。

1
可能是因为您没有创建一个新的数组,而是使用旧数组来存储该值。这就是为什么它在数组的末尾。要做你想做的事情是创建一个新变量,比如 $aData,并使用您的 foreach 循环将值插入到其中。 - Refilon
1
你不需要第二个数组来实现这个。使用for循环而不是foreach,并遍历数组的长度,利用for循环的索引变量,将任何您想要添加到您的数组中的元素加进去。 - Vahid Amiri
4个回答

19

Foreach循环在循环内部添加新值时不会遍历这些新值。

如果你想在两个现有的值之间添加新的值,可以使用第二个数组:

$values = array(
    'foo' => 10,
    'bar' => 20,
    'baz' => 30
);
$newValues = array();
foreach($values as $key => $value) 
{
    $newValues[$key] = $value;
    if($key == 'bar') 
    {
        $newValues['qux'] = 21;
    }
}
print implode(' ', $newValue);

还有,看看我在StackOverflow上最喜欢的一个讨论foreach循环的问题:PHP中foreach循环实际是如何工作的?


@Dennis 那么你应该把它发布为答案,而不是评论。 - user229044
点赞了你的评论 ;) 但当我开始写答案时,它还不存在。 - Lars Ebert
我认识@LarsEbert,哈哈我不怪你。而且meagar,是的可以这样做...但Lars已经这样做了。 - Refilon
谢谢。正如我预期的那样,似乎我需要在数组上循环两次。一次添加值,另一次处理数组... - zessx

5
你可以在值前使用&符号。
//populate all the promos into their promoG groups
foreach($unclaimedPromoGroups as &$unclaimedPromoGroup) {
    $_promo = new Promo();
    $_promo->promoGroupID = $unclaimedPromoGroup['promo_groupID'];
    $promo = $_promo->getGroupPromos();
    $unclaimedPromoGroup["promos"] = $promo;
}

1
这是一个非常简单而优雅的解决方案,非常好! - dbDev

2
为此,您需要创建一个新数组,
<?php
$values = array(
    'foo' => 10,
    'bar' => 20,
    'baz' => 30
);

$newarray = array();
foreach($values as $k => $v) 
{
    $newarray[$k] = $v;
    if($k == 'bar') 
        $newarray['qux'] = 21;
}

echo implode(' ', $newarray);

Demo:
http://3v4l.org/N4XgB


这不会在bar和baz之间添加新值。 - Lars Ebert

1
下面的解决方案使用相同的数组。
$values = array(
    'foo' => 10,
    'bar' => 20,
    'baz' => 30
);

function match($niddle, $haystack, $push, $offset = 0) {
    foreach(array_slice($haystack, $offset) as $key => $value) 
    {
        print $value . ' ';
        if($key == $niddle) 
        {
            $i = array_search($niddle, array_keys($haystack)) + 1;
            $haystack = array_slice($haystack, 0, $i, true) + $push + array_slice($haystack, $i, count($haystack) - $i, true);
            $haystack = match($niddle, $haystack, $push, $i);
            break;
        }
    }

    return $haystack;
}

$values = match('bar', $values, array('qux'=>21));

var_dump($values);

1
它仍然没有在同一个循环中打印新值。 - Lars Ebert
2
当然,新条目已经添加了。但不幸的是,foreach循环无法访问它。 - zessx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接