- ベストアンサー
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にいくものだと自分は思っています。 違うのでしょうか?
- みんなの回答 (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"; } } が正解ですね^^
その他の回答 (4)
- notnot
- ベストアンサー率47% (4900/10359)
もしかすると、 $arr=array(array(100,200),array('aaa','bbb','ccc')); と $arr=array(100,200,'aaa','bbb','ccc'); の区別が付いていないのですかね。 var_dump()とかprint_r()してみるとわかりますが、全く別物です。 前者のイメージが湧かないとすると、図でも書いてみるんですかね。
- march4
- ベストアンサー率50% (12/24)
私の出る幕は無さそうですが、ちょっとだけ。 ><?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)
>以上のようになると思います。 それがわかっているのに、なぜ、 ***** 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"; } } ではどうですか?
お礼
以下のようになると思います。 **** 200
補足
notnotさんへ 最初の判らなかったソースについて考えたのですが、こういう感じでしょうか? 最初のforeach文で変数fooにarray(100,200)が100、200の順に格納されてから2回目のforeach文で100、200の順に出力されているように考えられます。
- notnot
- ベストアンサー率47% (4900/10359)
$foo=array(100,200); print "*****\n"; foreach($foo as $var){ print $var ."\n"; } だとどうなると思いますか?
お礼
***** 100 200 以上のようになると思います。
お礼
回答ありがとうございます。 seimurakamさんの回答で、さらに判りました。