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 外でもそのままの型で残ってしまうので、注意が必要。