将值添加到foreach循环内的数组中

时间:2015-01-29 14:16:23

标签: php arrays foreach

我正在尝试在foreach循环内动态编辑数组。我基本上分析了每个键,如果这个键匹配我想要的键,我想在这个之后立即在数组中添加另一个条目。

如果我使用此代码,

$values = array(
    'foo' => 10,
    'bar' => 20,
    'baz' => 30
);

foreach($values as $key => $value){
    print $value . ' ';
    if($key == 'bar'){
        $values['qux'] = 21;
    }
}

我有2个问题,

  • 首先,输出为10 20 30,而不是预期的10 20 30 21
  • 第二,即使我解决了第一个问题,我的值仍然会在我的数组的末尾添加

如何在quxbar之间添加baz条目?

感谢您的想法。

4 个答案:

答案 0 :(得分:13)

在循环内部,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循环的一个我最喜欢的问题:How does PHP 'foreach' actually work?

答案 1 :(得分: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);

<强>演示:
http://3v4l.org/N4XgB

答案 2 :(得分:2)

您可以在值之前使用&符号。

//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;
}

答案 3 :(得分: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);