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

Add values to an array inside a foreach loop

我正在尝试在 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
  • 其次,即使我解决了第一个问题,我的值仍然会添加在我数组的末尾

如何在 barbaz 之间添加 qux 条目?

谢谢你的想法。

为此你需要创建一个新数组,

<?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

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);

此外,请参阅 Whosebug 上我最喜欢的一个问题,其中讨论了 foreach 循环:How does PHP 'foreach' actually work?

下面的解决方案使用相同的数组。

$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);

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

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