• ベストアンサー

foreachの実行結果について

お世話になります。 以下のソースの実行結果が自分のトレースしたのと何故違うのか頭を抱えています。 ご指導よろしくお願いします。 <?php $arr=array(array(100,200),array('aaa','bbb','ccc')); foreach($arr as $foo){ print "*****\n"; foreach($foo as $var){ print $var ."\n"; } } ?> <自分の答え> ***** 100 ***** 200 ***** aaa ***** bbb ***** ccc <正解> ***** 100 200 ***** aaa bbb ccc 正解の回答に納得が行かないのです… foreach文がネストしてて内側のforeachの処理が一回終了してから 外側のforeachにいくものだと自分は思っています。 違うのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

LINE 01| $arr=array( 02|   array(100,200) 03|   ,array('aaa','bbb','ccc') 04| ); 05| 06| 07| foreach($arr as $foo){           (1) 08|   print "*****\n";             A 09|   foreach($foo as $var){         (2) 10|     print $var ."\n";          B 11|   } 12| } このプログラムは (1)1回目   (このとき、$foo = array(100,200);)   命令A     print "*****\n";             // → *****     (2)1-1回目       $var = 100;       命令B         print $var."\n";         // → 100     (2)1-2回目       $var = 200;       命令B         print $var."\n";         // → 200 (1)2回目   (このとき、$foo = array("aaa","bbb","ccc");)   命令A     print "*****\n";           // → *****     (2)1-1回目       $var = "aaa";       命令B         print $var."\n";         // → aaa     (2)1-2回目       $var = "bbb";       命令B         print $var."\n";         // → bbb     (2)1-3回目       $var = "ccc";       命令B         print $var."\n";         // → ccc という流れで進んでいきます。 配列の中身を全て表示する「var_dump($array)」という関数があるので $foo, $varの内容を確認してみるとよいと思います。 >foreach文がネストしてて内側のforeachの処理が一回終了してから >外側のforeachにいくものだと自分は思っています。 混乱の原因はここですね。 内側のforeachの処理が全て終了してから その側のforeachの2回目に入ります。 想定された結果にしたいのでしたら、 foreach($arr as $foo){   foreach($foo as $var){  //←この2行が逆     print "*****"."\n";     print $var."\n";   } } が正解ですね^^

phantom12
質問者

お礼

回答ありがとうございます。 seimurakamさんの回答で、さらに判りました。

その他の回答 (4)

  • notnot
  • ベストアンサー率47% (4900/10359)
回答No.4

もしかすると、 $arr=array(array(100,200),array('aaa','bbb','ccc')); と $arr=array(100,200,'aaa','bbb','ccc'); の区別が付いていないのですかね。 var_dump()とかprint_r()してみるとわかりますが、全く別物です。 前者のイメージが湧かないとすると、図でも書いてみるんですかね。

  • march4
  • ベストアンサー率50% (12/24)
回答No.3

私の出る幕は無さそうですが、ちょっとだけ。 ><?php $arr=array(array(100,200),array('aaa','bbb','ccc')); foreach($arr as $foo){ print "*****\n"; foreach($foo as $var){ print $var ."\n"; } } ?> というコードを日本語でどういうフローになるか話してみますと、 親配列(子配列1、子配列2)をforeachでもって、 配列内の要素をすべて出し切る処理ですね。 foreachは、「全て出し切るまで、許してくれません(解放してくれません)」ので、 子配列1に処理が及ぶと、まず、子配列の要素全てが出力されます。 よって、 ***** //ご挨拶の星線分 100 //子配列の要素 200 //子配列の要素 //全て出し切ったので、ようやく子配列1はforeachに解放されます。 そして、次の子配列2へと処理が移ります。 (以下、同様です。) この点を正確に認識されれば、おそらく、 正解に辿り着くのは、時間の問題では!と思います。 がんばってみて下さい^^ 分からなければ、改めて補足致します。(たぶんw

  • notnot
  • ベストアンサー率47% (4900/10359)
回答No.2

>以上のようになると思います。 それがわかっているのに、なぜ、 ***** 100 ***** 200 ***** aaa ***** bbb ***** ccc と思うのかわかりません。 $arr1=array(100,200); $arr2=array('aaa','bbb','ccc'); for($i=1; $i<=2; $i++){ if($i==1) $foo=$arr1; else $foo=$arr2; print "*****\n"; foreach($foo as $var){ print $var ."\n"; } } ではどうですか?

phantom12
質問者

お礼

以下のようになると思います。 **** 200

phantom12
質問者

補足

notnotさんへ 最初の判らなかったソースについて考えたのですが、こういう感じでしょうか? 最初のforeach文で変数fooにarray(100,200)が100、200の順に格納されてから2回目のforeach文で100、200の順に出力されているように考えられます。

  • notnot
  • ベストアンサー率47% (4900/10359)
回答No.1

$foo=array(100,200); print "*****\n"; foreach($foo as $var){ print $var ."\n"; } だとどうなると思いますか?

phantom12
質問者

お礼

***** 100 200 以上のようになると思います。

関連するQ&A

専門家に質問してみよう