2015-01-29 2 views
6

Я пытаюсь редактировать массив «на лету» внутри цикла 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?

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

+1

Возможно, это связано с тем, что вы не создаете новый массив, а используете старый массив для хранения значения. Вот почему он находится в конце вашего массива. Чтобы сделать то, что вы хотите сделать, это сделать новую переменную, скажем, '$ aData', и вставить здесь значения с помощью цикла' foreach'. – Refilon

+0

Для этого вам не нужен второй массив. Вместо 'foreach' используйте цикл' for' и повторяйте длину массива и используя индексную переменную цикла for, добавьте все, что хотите в свой массив. – VSG24

ответ

9

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 обсуждающих цикл Еогеасп: How does PHP 'foreach' actually work?

+0

@Dennis Тогда вы должны были разместить его в качестве ответа вместо – meagar

+0

Упрощенный комментарий;) Но его там не было, когда я начал писать ответ. –

+0

Я знаю @LarsEbert, я не виню тебя, ха-ха. И meagar, да, это можно сделать ... но Ларс уже сделал это. – Refilon

1

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

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

+0

Это не добавит нового значения между баром и базом. –

+0

О, я пропустил это. –

0

В приведенном ниже решении используется тот же массив.

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

Он все еще не печатает новое значение в том же цикле. –

+0

Уверен, добавлена ​​новая запись.Но, к сожалению, петля 'foreach' не получит доступа к ней. – zessx

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; 
} 
Смежные вопросы