PHPを勉強中なのですが、多次元配列をforeachで全て出力する点について分からない箇所があるのでお聞きしたいです。
例えばなんですが、以下のようなものがあるとします。
php
1<?php 2$array[] = array('ID'=>7, 'title'=>'多次元配列の扱い'); 3$array[] = array('ID'=>6, 'title'=>'画像圧縮と軽量化のすすめ'); 4$array[] = array('ID'=>5, 'title'=>'初心者のためのgitコマンド'); 5?> 6 7 8 9<!DOCTYPE html> 10<html lang="ja"> 11<head> 12 <meta charset="UTF-8"> 13 <title></title> 14</head> 15<body> 16 <?php 17 foreach ($array as $key1 => $value1) { 18 foreach ($value1 as $key2 => $value2) { 19 print $value2 . ", "; //「.」は文字列連結 20 } 21} 22 23 ?> 24</body> 25</html>
上記のコードを実行しますと、
7, 多次元配列の扱い, 6, 画像圧縮と軽量化のすすめ, 5, 初心者のためのgitコマンド,
と表示されます。
ここまでで分からない点なのですが、foreach文の中の$key1や$key2,$value1や$value2の最後についている1や2の数字は何を意味しているのでしょうか?
そして、foreach文の中にforeach文を入れることによってなにがどう実行されているのでしょうか?
分かりにくい説明で申し訳ないのですが、教えて頂けたら幸いです...
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
分からなければ、各箇所で出力してみるとイイですよ。
php
1<?php 2$array[] = array('ID'=>7, 'title'=>'多次元配列の扱い'); 3$array[] = array('ID'=>6, 'title'=>'画像圧縮と軽量化のすすめ'); 4$array[] = array('ID'=>5, 'title'=>'初心者のためのgitコマンド'); 5 6echo '$array:'.PHP_EOL; 7var_export($array); 8echo PHP_EOL; 9 10foreach ($array as $first_key => $first_val) { 11echo '$first_val'.PHP_EOL; 12var_export($first_val); 13echo PHP_EOL; 14 foreach ($first_val as $second_key => $second_val) { 15 echo '$second_val'.PHP_EOL; 16 var_export($second_val); 17 echo PHP_EOL; 18 } 19}
php
1$array: 2array ( 3 0 => 4 array ( 5 'ID' => 7, 6 'title' => '多次元配列の扱い', 7 ), 8 1 => 9 array ( 10 'ID' => 6, 11 'title' => '画像圧縮と軽量化のすすめ', 12 ), 13 2 => 14 array ( 15 'ID' => 5, 16 'title' => '初心者のためのgitコマンド', 17 ), 18) 19 20$first_val 21array ( 22 'ID' => 7, 23 'title' => '多次元配列の扱い', 24) 25 26$second_val 277 28 29$second_val 30'多次元配列の扱い' 31 32$first_val 33array ( 34 'ID' => 6, 35 'title' => '画像圧縮と軽量化のすすめ', 36) 37 38$second_val 396 40 41$second_val 42'画像圧縮と軽量化のすすめ' 43 44$first_val 45array ( 46 'ID' => 5, 47 'title' => '初心者のためのgitコマンド', 48) 49 50$second_val 515 52 53$second_val 54'初心者のためのgitコマンド'
配列の中に配列が入っているので、最小単位になるまで、分解(?)しています。
変数の変移を追うのって、出力することでも追えるんですが、できればデバッグ環境を整えて下さい。
そうすると、学習がはかどります。
ステップ実行というのを行うと、一行ごとに何を行っているのか、変数がどう変化するのか、確認できるようになるため、サンプルを動作させたときにも、理解度が全然変わってきます。
デバッグ環境を整えるためだけに本を買っても良いと思います。
ここまで書いておきながら、おすすめできる本が私の知識の中になくて恐縮ですが^^;
投稿2017/07/16 07:59
退会済みユーザー
総合スコア0
0
ベストアンサー
foreach文の中の$key1や$key2,$value1や$value2の最後についている1や2の数字
これは簡単、変数名です。
あまり良くない宣言方法ですね。
例えば、以下のように変更しても同じ挙動になります。
こいつも、変数名は悪い例ですが……^^;
<?php $array[] = array('ID'=>7, 'title'=>'多次元配列の扱い'); $array[] = array('ID'=>6, 'title'=>'画像圧縮と軽量化のすすめ'); $array[] = array('ID'=>5, 'title'=>'初心者のためのgitコマンド'); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <?php foreach ($array as $first_key => $first_val) { foreach ($first_val as $second_key => $second_val) { print $second_val . ", "; //「.」は文字列連結 } } ?> </body> </html>
次に、foreachの挙動についてですが、
配列を、キーと値に分解してくれます。
例えば今回の、'ID'=>7, 'title'=>'多次元配列の扱い'
であれば、
1回目のループでのキーはID
、値は7
、
2回目のループでのキーはtitle
、値は多次元配列の扱い
となります。
追記
<?php $array[] = array('ID'=>7, 'title'=>'多次元配列の扱い'); $array[] = array('ID'=>6, 'title'=>'画像圧縮と軽量化のすすめ'); $array[] = array('ID'=>5, 'title'=>'初心者のためのgitコマンド'); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <?php foreach ($array as $first_key => $first_val) { printf('今から展開するのは、key: %s, value: %s<br>', $first_key, $first_val); foreach ($first_val as $second_key => $second_val) { printf('$first_valの中身は、key: %s, value: %s<br>', $second_key, $second_val); } echo '<hr>'; } ?> </body> </html>
追記2
一回目のforeach文,
foreach ($array as $first_key => $first_val)このキーの部分は例えばなんですが、
$first_key[0]としなくても、自動で$arrayの0番目の配列が選択されるということでしょうか?
大凡そのとおりです!
foreachは、配列の中身をキー
と値
に分解してくれる、と私は書きました。
その意味を深掘りしていきます。
例えば、ただひとつの配列、
$array = array('ID'=>7, 'title'=>'多次元配列の扱い');
があったとします。
この中身って、
{ ["ID"]=> int(7) ["title"]=> string(24) "多次元配列の扱い" }
ですよね?
では、こいつをforeachで回してやるとどうなるか?
先に参考コードを提示します。
<?php $array = array('ID'=>7, 'title'=>'多次元配列の扱い'); foreach ($array as $key => $value) { printf('キー:%s, 値:%s<br>', $key, $value); }
1回目のループ → $key:"ID"、$value:7
2回目のループ → $key:"title"、$value:"多次元配列の扱い"
となります。
$array
配列の持つ、キー("ID", "title")に対する値(7, "多次元配列の扱い")をそれぞれ対応させて持ってきてくれるわけですね。
そうだとした場合、
「$first_key => $first_val」は$arrayの中に入ってるキーが0番目の値が
array('ID'=>7, 'title'=>'多次元配列の扱い')の配列、
ということでしょうか...?
その通りです!
一回目のforeachで$first_valがarray('ID'=>7, 'title'=>'多次元配列の扱い')になるとします。
ということは、foreachの中にforeachがあるということなので、
「$second_key => $second_val」はキーがidの7を出力し、次にキーが'title'の'多次元配列の扱い
を出力し、
そして一回目のforeachに戻り次は$arrayのキーが1、値がarray('ID'=>6, 'title'=>'画像圧縮と軽量化のすすめ')を実行し、
2回目のforeachを実行し~というのを繰り替えしていく形になりますでしょうか...?
完璧ですね。
その通りです!
蛇足ですが、キーが不要な場合は、
foreach ($array as $value)
のようにかけたりもします。
投稿2017/07/16 06:26
編集2017/07/16 09:27総合スコア2004
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/16 07:36
2017/07/16 07:52
2017/07/16 07:55
2017/07/16 08:00
2017/07/16 08:02
2017/07/16 08:10
2017/07/16 08:41
2017/07/16 09:27
2017/07/16 09:46
2017/07/16 09:51
0
$key1 = 0, $value1 = array('ID'=>7, 'title'=>'多次元配列の扱い') $key2 = 'ID', $value2 = 7 "7, " と表示 $key2 = 'title', $value2 = '多次元配列の扱い' "多次元配列の扱い, " と表示 $key1 = 1, $value1 = array('ID'=>6, 'title'=>'画像圧縮と軽量化のすすめ') $key2 = 'ID', $value2 = 6 "6, " と表示 $key2 = 'title', $value2 = '画像圧縮と軽量化のすすめ' "画像圧縮と軽量化のすすめ, " と表示 $key1 = 2, $value1 = array('ID'=>5, 'title'=>'初心者のためのgitコマンド') $key2 = 'ID', $value2 = 5 "5, " と表示 $key2 = 'title', $value2 = '初心者のためのgitコマンド' "初心者のためのgitコマンド, " と表示 ```newyeeさんが書いたコードのまま、すべて展開してみました。 こんな風にループします。
投稿2017/07/16 07:44
編集2017/07/16 07:56総合スコア4437
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/16 09:55
退会済みユーザー
2017/07/16 13:27