参照渡し自体が非推奨という話は一旦置いておきますが、参照渡しがちゃんと理解できていなくてちょっとハマりました。
$meats = array('beef', 'pork', 'mutton');
foreach($meats as &$meat){
$meat = 'so big ' . $meat;
}
foreach($meats as $meat){
echo($meat);
}
// 'so big beef'
// 'so big pork'
// 'so big pork'
配列の最終要素の参照がうまくいきまてん。
原因
はじめのループを抜けた時点で\$meat変数のポインタは外れていないため、\$meatは\$meats[2]を指したままでした。
そのため、2回目のループでは、以下のようなことが起こっています。
・\$meats[2]に\$meats[0]を代入 → // \$meats[0] = 'so big beef', \$meats[2] = 'so big beef'
・\$meats[2]に\$meats[1]を代入 → // \$meats[1] = 'so big pork', \$meats[2] = 'so big pork'
・\$meats[2]に\$meats[2]を代入 → // \$meats[2] = 'so big pork', \$meats[2] = 'so big pork'
ややこし…。
解決策
・はじめのループの後で$meat変数の参照を解除(unset)する
・もしくは、2回目のループでは別の変数を使う
$meats = array('beef', 'pork', 'mutton');
foreach($meats as &$meat){
$meat = 'so big ' . $meat;
}
unset($meat);
foreach($meats as $meat){
echo($meat);
}
// 'so big beef'
// 'so big pork'
// 'so big mutton'