質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

12548閲覧

[PHP]多次元配列を使ったforeach文での出力について

newyee

総合スコア213

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2017/07/16 06:17

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

newyee

2017/07/16 09:55

ご丁寧にありがとうございます! 分かりやすく書いていただき感謝いたします。 他の回答者様のご助言もあり、なんとか無事理解することができました! おお!一行ずつどのように実行が行われるかを確認できる機能に関してなのですが、javascriptを勉強していた際に、デバックツールを起動して、ファイルを読み込んで,breakという機能を使い一行ずつfor文なんかをどのように実行されているかを確かめて勉強していたんですよね。 なんですけど、phpでやってみたら、当然かもしれませんが裏の処理なのかできなかったんですよね(笑)なので、そういうことできたらいいなぁ~と思っていたので今めっちゃ嬉しいです!! ステップ実行っていうんですね!調べてみたいと思います!
退会済みユーザー

退会済みユーザー

2017/07/16 13:27

php でデバッグ環境を整えるには、開発環境(IDE)+Xdebug で作るので、ベースとする IDE を探すところから始める感じですね。 私は、 VisualStudio Code を使用してますが、好き嫌いが別れるところなので、ちゃんと試してみるのが良いです。 がんばって。
guest

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
nnahito

総合スコア2004

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shi_ue

2017/07/16 06:36

一回目のループは $array 配列の数字のインデックスがキーでは?
newyee

2017/07/16 07:36

ご回答ありがとうございます。変数名の指定が自由であるということは理解ができたのですが、まだ分からない点があります... 一回目のforeach文で, foreach ($array as $first_key => $first_val)としていて、2回目のforeach文で,foreach ($first_val as $second_key => $second_val)としています。この場合ですと、「$first_val」は7ということになると思います。しかし、2回目のforeach文では$first_valを配列変数として指定しています... もう訳が分からなくて...これは一体どういうことなのでしょうか...?
nnahito

2017/07/16 07:52

> shi_ueさん 書き方が紛らわしくってすいません。 今回のケースでは、2回目のforeach文は、2回ループします。 'ID'=>7の分と、'title'=>'多次元配列の扱い'の分ですね。 そこを言いたかったのです。 確かに、1回目のforeachでは、キーは数値になり、値は配列になりますね。
nnahito

2017/07/16 07:55

> newyee さん >> この場合ですと、「$first_val」は7ということになると思います。 いいえ、first_valはarrayになります。 追記にコードを書いてみますので、実行してみてください
shi_ue

2017/07/16 08:00

再度ツッコミ失礼します。 外側のループでprintf に配列を渡してます。
nnahito

2017/07/16 08:02

わざとです。 そちら、質問者さんの「しかし、2回目のforeach文では$first_valを配列変数として指定しています...」に対して、どのように動いているかをお見せできたらなと思い、入れております
shi_ue

2017/07/16 08:10

なるほど!
newyee

2017/07/16 08:41

大変ご丁寧にありがとうございます。 おおよそ理解することができたのですが、まだ理解しきれない部分がありまして... 何度も申し訳ないです... 一回目のforeach文,foreach ($array as $first_key => $first_val)このキーの部分は例えばなんですが、$first_key[0]としなくても、自動で$arrayの0番目の配列が選択されるということでしょうか? そうだとした場合、「$first_key => $first_val」は$arrayの中に入ってるキーが0番目の値がarray('ID'=>7, 'title'=>'多次元配列の扱い')の配列、ということでしょうか...? そして、もう一点だけお伺いさせて下さい...<(_ _)> これはfor文の質問になってしまうかもしれませんが、一回目の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を実行し~というのを繰り替えしていく形になりますでしょうか...? 大変ながながとすみません...
nnahito

2017/07/16 09:27

ついきしまんた
newyee

2017/07/16 09:46

大っっっっ変ご丁寧にありがとうございます(:_;) なんとか理解することができました!! 大変長々とお付き合いいただき感謝致します... shi_ueさんも色々ご協力いただきありがとうございました!!
nnahito

2017/07/16 09:51

foreachはforに比べて理解が難しい部分がありますから、仕方ありません! がんばってくださいね!
guest

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
shi_ue

総合スコア4437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

newyee

2017/07/16 08:48

ご丁寧にありがとうございます。 最初このコードの意味が分からなかったのですが、他の回答者様の助言もありまして、より深く理解することができました!
newyee

2017/07/16 09:56

無事理解することができました~ 色々ご協力くださり、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問