レファレンスではまる

foreach を使ったループで以下のように書いたら、

foreach ( $list as $item ) {
  $item['hoge'] = 'fuga';
}

ループを抜けたら $item['hoge'] が空っぽになってしまってはまりました。

http://groundwalker.com/blog/2008/02/php_foreach.html

配列の各要素を書き換えたいとき、PHP5なら、&をつけることで、要素を一時変数にコピーせずに参照することができる。

ということらしく、以下のように書くのが正しいようです。

foreach ( $list as &$item ) {
  $item['hoge'] = 'fuga';
}