![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_08.png?5a7ff87)
お世話になります。
以下のソースの実行結果が自分のトレースしたのと何故違うのか頭を抱えています。
ご指導よろしくお願いします。
<?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";
}
}
が正解ですね^^
No.4
- 回答日時:
もしかすると、
$arr=array(array(100,200),array('aaa','bbb','ccc'));
と
$arr=array(100,200,'aaa','bbb','ccc');
の区別が付いていないのですかね。
var_dump()とかprint_r()してみるとわかりますが、全く別物です。
前者のイメージが湧かないとすると、図でも書いてみるんですかね。
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
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";
}
}
ではどうですか?
この回答への補足
notnotさんへ
最初の判らなかったソースについて考えたのですが、こういう感じでしょうか?
最初のforeach文で変数fooにarray(100,200)が100、200の順に格納されてから2回目のforeach文で100、200の順に出力されているように考えられます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- PHP ランキングを表示する際の画像の大きさを固定することは可能でしょうか? <?php if ( has_ 1 2022/07/21 14:55
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- その他(プログラミング・Web制作) listへのappendが出来ない件 1 2022/12/06 21:44
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
行列
-
fgetc関数について
-
Perlで重複行を削除したい
-
PHPで10連ガチャを作成したいの...
-
verilogで、配列の一部をタスク...
-
class内部でarray_mapをつかう...
-
php で1から100までの素数の表...
-
プログラミングのPythonのnoteb...
-
CArrayの要素としてCStringArra...
-
配列の比較
-
foreachの実行結果について
-
PHPでユニークIDを作る
-
テーブルの項目内に「含まれる...
-
プルダウンメニューにDBの内容...
-
配列をループでたくさん宣言し...
-
PHPで、CSVファイルを、指定し...
-
foreachで上限回数指定方法また...
-
$_SESSIONに二次元配列を使える...
-
別ファイルの構造体の値を読み...
-
SELECT 使用時の bindValue の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミングのPythonのnoteb...
-
スカラーのベクトル微分
-
特定の文からメールアドレスの...
-
CArrayの要素としてCStringArra...
-
C言語 最大値と最小値を求めて...
-
行列
-
読み(あ行~わ行)ごとに分け...
-
配列の要素(value)に、変数を...
-
C言語の配列をPush(追加)する...
-
STLのvectorで作った配列をメン...
-
php で1から100までの素数の表...
-
【PHP】配列のキー名の修正は可...
-
Perlで重複行を削除したい
-
fgetc関数について
-
CArrayのソート
-
ファイルの書き込みについて教...
-
配列の添え字が小数だとどうなる?
-
PHPのmin関数、「1」以上の数値...
-
forとかで連番の変数を一気に格...
-
delphi 2次元配列がわかりません
おすすめ情報