Изменить следующий элемент в массиве во время цикла foreach () - PullRequest
1 голос
/ 28 февраля 2012

Как я могу изменить следующий элемент в цикле foreach () во время цикла? Я думаю, что это как-то связано с разговором с переменной по ссылке, но я не уверен, как. i.e.:

$arr = array( array('color' => 'red',    'type' => 'apple'),
              array('color' => 'yellow', 'type' => 'banana'),
              array('color' => 'purple', 'type' => 'grape')
            );

foreach($arr as $k => $v) {
   echo "<br> The ".$v['type'].' fruit is '.$v['color'];

   // change the color of the next fruit?
   if($v['type'] == 'apple') { $arr[$k+1]['color'] = 'green'; }
}

Я хотел бы, чтобы это сказать мне банан зеленый, но он упорно придерживается банана будет желтым ...

(ОБНОВЛЕНИЕ: исправлена ​​глупая логическая ошибка в моем исходном вопросе. Ответ, отмеченный ниже, является правильным.)

Ответы [ 3 ]

5 голосов
/ 28 февраля 2012

foreach проходит через массив, беря копию массива, а не по ссылке. Вам нужно перебрать массив по ссылке, используя амперсанд & в значении массива.

foreach($arr as $k => &$v) {
   echo "<br> The ".$v['type'].' fruit is '.$v['color'];

   // change the color of the next fruit?
   if($v['type'] == 'banana') { $arr[$k+1]['color'] = 'green'; }
}
0 голосов
/ 28 февраля 2012

Счетчик должен остаться прежним

$arr = array( array('color' => 'red',    'type' => 'apple'),
          array('color' => 'yellow', 'type' => 'banana'),
          array('color' => 'purple', 'type' => 'grape')
        );

foreach($arr as $k => $v) {
  echo "<br> The ".$v['type'].' fruit is '.$v['color'];

  // change the color of the next fruit?
  if($v['type'] == 'banana') { $arr[$k]['color'] = 'green'; }

  // now echo the new color from the original array 
   echo "<br> The ".$arr[$k]['type'].' fruit is now '.$arr[$k]['color'];
}
0 голосов
/ 28 февраля 2012
$k=array_keys($yourarray);
    for($i=0; $i<sizeof ($k); $i++) {
       if($yourarray[$k[$i]] == "something") {
           $yourarray[$k[$i+1]] = "something else"; 
       }
    }
}     

извините, форматирование - это все шатко, так как я отвечаю с телефона ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...