php の foreach は基本値渡しで、受け取った値を変更しても当然元の配列データは変更されない。
でも実際は参照渡しもできることを知ったので一応メモ。
以下は普通の値渡しの例。
$enjoi = array("normal", "crazy");
foreach( $enjoi as $e )
{
if( $e == "crazy" )
{
$e = "normal";
}
}
var_dump($enjoi);
array(2) { [0]=> string(6) "normal" [1]=> string(6) "crazy" }
でも関数の参照渡しみたいに & をつけてやると、参照渡しを使って foreach で配列を処理できる。
$enjoi = array("normal", "crazy");
foreach( $enjoi as &$e )
{
if( $e == "crazy" )
{
$e = "normal";
}
}
var_dump($enjoi);
array(2) { [0]=> string(6) "normal" [1]=> &string(6) "normal" }
同様に key-value 配列を扱う場合も value の変数に & をつければ同じようにできる。
foreach( $enjoi as $key => &$val ) { ... }
foreach で参照渡しをした時の注意点として、ちょっとしたバグを引き起こす場合がある。以下のコードを見てみると、
$enjoi = array("normal", "crazy");
foreach( $enjoi as &$e )
{
if( $e == "crazy" )
{
$e = "normal";
}
}
$e = "cool";
var_dump($enjoi);
array(2) {
[0]=>
string(6) "normal"
[1]=>
&string(4) "cool"
}
なんと配列の最後の値が cool に変わってしまう。これは foreach の最後に参照渡しした $e がそのまま foreach 以外でも参照型の変数として残るため。
参照渡しした変数は foreach 外でもそのままの型で残ってしまうので、注意が必要。