主に IT 技術を整理するためにメモ的に書き溜めています。少しだけフリーソフトもあるよ。コメントを残すには、 facebook を使ってください。

php の foreach で参照渡しをするには

最終更新日 2012-07-25 21:58:09 (1年以上前の記事です)

phpforeach は基本値渡しで、受け取った値を変更しても当然元の配列データは変更されない。
でも実際は参照渡しもできることを知ったので一応メモ。

以下は普通の値渡しの例。

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

最終更新日 2012-07-25 21:58:09

コメント このエントリーをはてなブックマークに追加

フリーソフトウエア
EnjoiFLV
EnjoiPacket
EnjoiCrypto
ランキング
rank2, rank3, rank7, rank10, rank11
todo メモ
facebook 対応
ページ処理
RSS feed
検索機能
認証いる?
更新日表示
実はカテゴリ機能
多言語
実はユーザ機能
ソースその内公開
動作環境メモ
php-5.1.6 with PDO
SQLite-3.3
IE6
FireFox-1.5
RSS
非認証

検索
Google