Добавление значений в массив внутри цикла 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
  • во-вторых, даже если я решу первую проблему, мое значение все равно будет добавлено в конце мой массив

как я мог добавить qux запись между тегами bar и baz кто?

Спасибо за ваши идеи.

4 ответов


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


для этого нужно создать новый массив,

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


перед значением можно использовать знак амперсанда.

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

Решение ниже использует тот же массив.

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