2012-02-28 4 views
1

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

$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'; } 
} 

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

(UPDATE: исправлена ​​глупая логической ошибка в моем оригинальном вопросе Ответ, помеченный ниже, верен.)

ответ

5

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'; } 
} 
+1

Это только одна часть решения (но тем не менее очень важно). Когда '$ v ['type'] == 'banana'' истинно, следующий фрукт, который модифицируется, является' grape'. Если банан должен быть зеленым, он должен быть '$ v ['type'] == 'apple''. –

+1

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

+2

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

0
$k=array_keys($yourarray); 
    for($i=0; $i<sizeof ($k); $i++) { 
     if($yourarray[$k[$i]] == "something") { 
      $yourarray[$k[$i+1]] = "something else"; 
     } 
    } 
}  

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

-1

Счетчик должен оставаться тот же

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