dポイントプレゼントキャンペーン実施中!

お世話になります。
以下のソースの実行結果が自分のトレースしたのと何故違うのか頭を抱えています。
ご指導よろしくお願いします。
<?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にいくものだと自分は思っています。
違うのでしょうか?

A 回答 (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";
  }
}

が正解ですね^^
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/08/28 20:59

もしかすると、


$arr=array(array(100,200),array('aaa','bbb','ccc'));

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

私の出る幕は無さそうですが、ちょっとだけ。



><?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
    • good
    • 0

>以上のようになると思います。


それがわかっているのに、なぜ、
*****
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";
}
}
ではどうですか?

この回答への補足

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

補足日時:2009/08/27 00:00
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/08/26 23:10

$foo=array(100,200);


print "*****\n";
foreach($foo as $var){
print $var ."\n";
}
だとどうなると思いますか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/08/26 22:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!