Unknown::Programming このページをアンテナに追加 RSSフィード

2006-07-20 悪夢

(PHP4格言)参照したけりゃfor使え

悪夢のような毎日が続いております。

さぁ今日もPHPネタで盛り上がっていきましょう!

何か思い通りの動きしないなーと思ってまさかと思ってPHPマニュアル見てみたんですが・・・、

foreachのイテレータって「コピー」なんですってね。勘弁してちょ。

しかもリファレンスで受け取る手段が無いんですって。勘弁してちょ。


 $obj       = new stdClass();
 $obj->hoge = 0;
 $array     = array(&$obj);
 
 $data = array();
 foreach($array as $val) { // $valには「コピー」されたオブジェクトが格納される
     $data []=& $val;
 }
 $data[0]->hoge = 10;
 
 print $obj->hoge; // 「0」と表示

ってことでコピーになっちゃうんでコピーされた$data[0]->hogeを書き換えても$obj->hogeには影響しないわけです。

これを回避しようと思ったらもうfor使うしかないわけですよ。


 $count = count($array);
 for( $i=0; $i < $count; $i++ ){
     $data []=& $array[$i];
 }

せっかくforeachという便利なものがあるのにこれじゃ使えねーーーーーーー!!!

なんでわざわざ先祖帰りするようなソースを書かねばならんのか誰か教えて下さい(;;)

もしかして僕が勘違いしてるだけ?使い方間違ってる?

あぁ、頭がイタイです。

ちなみにPHP5ではこの問題は解決してるみたいです。

ちゅーかどーせならPHP5でプログラムさせてくれ・・・。

bobchinbobchin 2006/07/21 20:07 あまりかわんないですかね?
$data = array();
foreach($array as $k => $v) {
$data []=& $array[$k];
}

fbisfbis 2006/07/22 13:56 なるほど、こういうやり方もあるんですね。
いや、for使うよりはこっちの方がいいですね。
早速使わせていただきます!

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/fbis/20060720/1153353676