2013-06-19 2 views
0

У меня есть цикл, который необходимо пройти через каждый элемент. Поэтому, естественно, цикл foreach кажется лучшей идеей. Однако мне нужно добавить элемент в массив, когда он итерации. Я попробовал следующее без везения.Динамическое добавление к текущему массиву foreach

foreach ($allitems as $item) { 
    //Do some stuff here 

    if ($value === true) 
     $allitems[] = 'New item'; 
} 

Я узнал Еогеасп петли, кажется, использовать который ссылается копию массива, поэтому редактирование массива не регистрирует в цикле.

Обходной заключается в использовании старшего стиля в то время как петли следующим образом:

while (list($key, $item) = each($allitems)) { 
    //Do some stuff here 

    if ($value === true) 
     $allitems[] = 'New item'; 
} 

Очевидно, что цикл Еогеаспа бы лучше и более эффективен. Является ли это возможным? Или же структура является наилучшим решением.

ответ

2

Да, это возможно:

foreach ($allitems as &$item) { 
    //Do some stuff here 

    if ($value === true) 
     $allitems[] = 'New item'; 
} 

Согласно docs, вам нужно передать ссылку (используя & перед если $ пункт)

Более конкретный пример:

<?php 
$allitems = array(1,2,3,4); 

foreach ($allitems as &$item) { 
    echo $item."\n"; 
    if ($item == 2) { 
      $allitems[] = "Blah"; 
    } 
} 
?> 

Эти выходы (с использованием php из командной строки)

1 
2 
3 
4 
Blah 
+1

Я уверен, что я пробовал это без везения. Он успешно присоединился к массиву. Однако foreach не смог получить доступ к новым элементам. После этого я смог получить к ним доступ. – foochow

+0

Попробуйте пример и посмотрите, работает ли он – jh314

+0

. Попробовал ваш пример, и он работает, поэтому я немного поиграл. Оказывается, это произошло из-за того, что я вызывал append как я был на последней итерации моего массива ('$ item == 4' в примере). Я читал ранее, что приращения foreach затем выполняются. Таким образом, петля предположила, что это было сделано. – foochow

0

Вы могли бы сделать Еогеасп ... как это ....

Но это добавляет больше коды ... поэтому его не лучше, чем ваше время цикл ..

foreach($array as $val){ 
    if($val=="check"){$append[]="New Item";} 
} 
$array = array_merge($array, $append); 

Конечно, если вы хотите, чтобы ваша структура maintained..then достаточно использовать array_push

+0

не должен 'array_merge' находиться внутри foreach? – foochow

+0

Нет, потому что вы зацикливаете, строите новый массив, и когда вы закончите ... объедините их вместе – KyleK

+0

Ahh, возможно, я не был слишком ясен. Моя цель состоит в том, чтобы перебирать новые элементы, поскольку они добавляются в массив foreach. – foochow

1

это кажется как обычный for петля будет лучше для этого:

for ($i = 0; $i < count($array); $i++) { 
    // Do some stuff here that calculates $value from $array[$i] 
    if ($value === true) { 
    $array[] = "New Element"; 
    } 
} 
Смежные вопросы