【问题标题】:Add values to an array inside a foreach loop将值添加到 foreach 循环内的数组
【发布时间】:2015-03-28 19:21:21
【问题描述】:

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

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

感谢您的想法。

【问题讨论】:

  • 这可能是因为您没有创建新数组,而是使用旧数组来存储值。这就是为什么它位于数组末尾的原因。要做你想做的事是让一个新变量让我们说$aData并用你的foreach循环插入那里的值。 span>
  • 您不需要第二个数组来实现这一点。而不是 foreach 使用 for 循环并遍历数组的长度并使用 for 循环的索引变量,将您想要的任何内容添加到数组中。

标签: php arrays foreach


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 它仍然不会在同一个循环中打印新值。
    • 当然,新条目已添加。但不幸的是,foreach 循环无法访问它。
    【解决方案3】:

    在循环内部,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?

    【讨论】:

    • @Dennis 那么你应该把它作为答案发布
    • 支持您的评论 ;) 但是当我开始写答案时它并不存在。
    • 我知道@LarsEbert,我不怪你哈哈。和meagar,是的,可以做到这一点..但Lars已经这样做了。
    • 谢谢。正如我所料,我似乎需要在我的阵列上循环两次。一次加值,一次处理数组...
    【解决方案4】:

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

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

    【讨论】:

    • 这不会在 bar 和 baz 之间添加新值。
    猜你喜欢
    • 2019-03-31
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多