it-swarm.com.ru

Добавить значения в массив внутри цикла 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?

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

7
zessx

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

12
Lars Ebert

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

//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
Radiumrasheed

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

<?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
Parag Tyagi -morpheus-

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

$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
QHip