Добавление значений в массив внутри цикла 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);
перед значением можно использовать знак амперсанда.
//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);