PHP基本編

配列

1. 準備

 これまで同様にサンプルを動かすためのファイルを作っておきます。[Xamppフォルダ]→[htdocsフォルダ]→[pkpkisoフォルダ]で、ひな形ファイル「hina.html」を[Ctrl]+[c]し、[Ctrl]+[v]を2回すると2つコピーができますので、名前をそれぞれ「kihon07.html」と「kihon07.php」に変更。以下のように編集します(ここで時間をかけても仕方ないのでコピペでOK)。

  kihon07.html
  

  kihon07.php
  

 サンプルの内容は簡単です。kihon07.htmlでは<form>タグでkihon07.phpにデータを送る設定をし、そのデータ入力部品として<textarea>と送信ボタン<input type="submit">、リセットボタン<input type="reset">を設置してます。
 一方、kihon07.phpでは、$_POST(postメソッド)でデータを受け取って変数$gakuseiに代入し改行タグと結合してecho命令で表示しています。
 作成後、Xamppを起動しlocalhostから表示して下さい。「http://localhost/phpkiso/kihon07.html」です。Xamppについては準備編・Xamppの起動Xamppの設定をご確認下さい。

  

  

2. 配列

 PHPをはじめとする多くのコンピュータプログラムにとって「配列」も非常に重要かつパワフルな要素です。
 配列とは何か?わかりやすく言えば「番号やフレーズで識別されるキーを持った一連の変数」といったとこでしょうか。データを入れる変数の箱の特殊なもの。同じ形の変数の箱がずらーっと並んでいてそれぞれが「番号」や「フレーズ」で区別されているような・・次の図のようなイメージです。

  

 まさに番号のついた連なった変数の箱です。このような番号のついた配列を「インデックス配列」と言ったりします。区別するための番号がついているからインデックス、というわけですね。あるいは「フレーズ」のキーで区別される場合なら次のような感じになります。

  

 今度は番号の代わりにフレーズが入ってますよね。フレーズと呼んでも識別名と呼んでも構いませんが、番号ではない文字列が箱に記載されています。これも配列ですが、識別するための文字列で内容や配列の名前を連想できるからか、このような配列を「連想配列」と呼びます。
 この形を見て「前にも出てきた」と気づいた人、正解です。これまでに何度も登場している「$_POST['~']」や、その親戚の「$_GET['~']」はまさにコレと同じ形。もちろんそれらはPHPであらかじめ定義済みの変数ですが、形式として連想配列の形になっています。
 配列の書き方は下のイメージの通り。配列名は変数名と同じルールに従いますが(基本編・データ渡しと変数)、後半に「[ ]」をつけて配列の要素を識別するための「キー」が指定されます。番号をキーとするインデックス配列は[ ]内は数値。フレーズをキーとする連想配列の場合は[ ]内は「'」(シングルコーテーション)でくくってキーフレーズを指定します。

  

3. 配列の意義とArray()

 ここまでのところでは、なぜ配列がそんなに便利なのかわかりません。そこで次のような状況を考えましょう。3人分の点数を「普通の変数」に代入し、表示する場合を考えてみます。これは配列を使わない例なので見るだけでOK。サンプルを作る必要はありません。


SPONSORED LINK



  

 意味はわかりますね?$gakuseilist0~2という「普通の変数」に、それぞれ、太郎、次郎、花子という文字列を入れてecho命令で表示する、ということをやっています。変数名に番号がついているので配列に似てますが、[ ](四角カッコ)がありませんので、これらは配列ではなく「普通の変数」です。そして結果は「太郎」「次郎」「花子」が改行されて表示されます。
 ですがデータが増えたらどうでしょう?表示する点数が100人分になったら、1000人分になったら・・・プログラムを書くのはもちろん見るだけでもツラいでしょう。そんな時に「配列」が力を発揮します。というわけで、以下のサンプルで配列の効果を確かめます。kihon07.phpを以下の通り修正して下さい。最初の3行はもともとあった部分。4行目から追加しています。

  kihon07.php(php部分以外は省略)
  

 追加した4行目の「array()」関数から説明します。これは配列を定義したり、配列の要素を設定するための関数です。サンプルで使われているところを抜き出すと次のようになります。

  $gakuseilist = array('太郎','次郎','花子');

 ここでは「array()」関数によって「$gakuseilist」という配列を定義しつつ、その要素として文字列を3つ指定しています。まず左辺の「$gakuseilist」は、普通の変数と変わらないじゃないかと思うかもしれませんが、これで配列として定義されますので安心して下さい。
 次に右辺の「array()」関数。3つの文字列が設定されています。各要素は文字列なので「'」(シングルコーテーション)で囲んであります。
 そして「=」を使って、右辺の「array()」関数の結果を、左辺の「$gakuseilist」という変数に代入するような形に記述されていますね。これを実行すると、$gakuseilistがインデックス配列として定義され、キー「0」から順に、$gakuseilist[0]、$gakuseilist[1]、$gakuseilist[2]にそれぞれ「太郎」「次郎」「花子」が設定されます。
 上記は文字列を代入する例ですが、数値の場合も同じように使えます。数値の場合は「'」(シングルコーテーション)がいりませんので以下のようになります。

  $tensu = array(85, 92, 68);

 これも「array()」関数によって$tensuという配列を定義しています。実行すると、$tensu[0]、$tensu[1]、$tensu[2]にそれぞれ数値の「85」「92」「68」が設定されます。このように「array()」関数をを使うと、1行で配列の定義と複数データの配列への入力ができます。
 一方「$hogehogeは配列ですよ」とだけ指定し、特に要素として設定するデータがない場合は「()」内を書かずに次のように指定します。これで$hogehogeは配列になります。$hogehoge[0]や$hogehoge[1]などが変数として使えるようになり、それらにデータを代入したり、内容を計算したり表示させたりすることができるようになります。

  $hogehoge = array();

 サンプルの説明に戻りましょう。5行目からのfor文です。「$i=0」から始めて$iを1ずつ増やし「$i<3」の間、{ }内の「echo $gakuseilist[$i].<br>';」を繰り返す、という意味ですね。echo命令での出力のところ。配列が結合されているので少し見づらいですが、配列と改行タグが「.」(ピリオド)で結合されています。拡大すると次のようになっています。

  echo $gakuseilist[$i].'<br>';

 ところで、この配列には、キーとしてforループのカウント変数の$iが指定されています。つまり、配列のキーは、変数でも指定できるということです。そしてforループが繰り返されることで、$iの値は0→1→2、と増えますので、出力される変数も、$gakuseilist[0]→$gakuseilist[1]→$gakuseilist[2]と変化します。ですので、これを実行した結果は「太郎」「次郎」「花子」が改行されて表示される、ということになります。つまり、これは上の「普通の変数」を使ったサンプルと、結果的には同じことをしているわけです。データが3件ぐらいだと違いが分かりにくいですが、データが増えた状況を想像すると、配列の意義がわかるでしょう。
 理解できたらlocalhost経由でサンプルを実行してみて下さい。「太郎」「次郎」「花子」が改行されて表示されればOKです。うまくいかないときはよく見直しましょう。

4. 区切って配列化するexplode()

 「array()」関数を使って配列を定義する方法を確認しましたが、データが最初からプログラムに組み込まれていることはそれほどなさそうです。上のサンプルで確かめたような名前のデータは、ウェブページからの入力とかファイルやデータベースからの読み込みなど、プログラムの外から与えられることが普通でしょう。
 というわけでウェブページからの入力についてサンプルで確かめましょう。ウェブページからの入力でも<input type="checkbox">のチェックボックスによるものついてはこのページの下の方の説明をご覧下さい。ファイルからの読み込みについては次の資料基本編・ファイル入出力で説明します。
 話を元に戻して「kihon07.php」を次のように編集します。元のphpプログラムの3行目と4行目のところを書き換えています。

  kihon07.php(php部分以外は省略)
  

 説明します。まずもともとあった2行目まではOKです。kihon07.htmlからpostメソッドで届いたgakuseiデータを、変数$gakuseiに代入している、ということです。問題は3行目の「explode()」関数です。拡大します。

  $gakuseilist = explode(',',$gakusei);

 これの意味は、変数$gakuseiの内容を、「,」(カンマ)で分割して、分割された部分文字列をインデックス配列$gakuseilistに入れる、ということです。具体的には、もし$gakuseiに「太郎,次郎,花子」という文字列が入っていれば、「,」(カンマ)で分割した「太郎」「次郎」「花子」をそれぞれ$gakuseilist[0]、$gakuseilist[1]、$gakuseilist[2]に入れる、ということになります。
 つまり「explode()」関数は、文字列を、その文字列に含まれる特定の文字や文字列で分割し、分割された部分文字列をインデックス配列に入れる、という関数になります。文字列は、変数じゃなくても指定できます。区切り文字も「,」(カンマ)じゃなくても、「/」(スラッシュ)や「:」(コロン)はもちろん「and」や「<>」(大なり小なりカッコ)のような文字列でもOK。区切り文字が「and」なら元データが「太郎and次郎and花子」の場合、「太郎」「次郎」「花子」と分割されます。ただ「MarkandBillandSandy」のような場合、最後の「Sandy」の中にも「Sandy」があるため、「S」と「y」も分割されてしまいます。元の文字列にない区切り文字を指定する必要があります。ですので普通あり得ないような「<>」(大なり小なりカッコ)とか「*+」(アスタリスクとプラス)とかを区切り文字にしたほうが安心かもしれません。というわけで以下のような書き方もできます。

  $hogehoge = explode('<>','日本<>アメリカ<>カナダ');

 この意味は文字列「日本<>アメリカ<>カナダ」を「<>」で分割し「日本」「アメリカ」「カナダ」を、それぞれ配列$hogehoge[0]、$hogehoge[1]、$hogehoge[2]に代入する、ということになります。わかってきましたか?
 もう一つ実践的な話。ウェブページでデータ入力を受け付ける場合に区切り文字としてよく使われるものに「改行」や「タブ」があります。目に見えない「改行」や「タブ」を「区切り文字」と呼ぶことに違和感があるかもしれませんが、これらも目に見えないだけで文字コードを持った文字の一種。一方で「,」(カンマ)や「and」のように文字列の中に含まれることはありません。ですのでこれらはむしろ「区切り文字」として非常に都合が良いわけです。
 実際ウェブページからデータを入力する際、データ項目ごとに改行して入力するとやりやすそうな気がしませんか?あるいはエクセルに入力されたデータは横方向のセル同士をコピーして貼り付けるとタブ区切りになります。なのでウェブで一連のデータを入力してもらう仕組みを作る際に、データの区切り文字として「改行」や「タブ」は便利なのです。
 それではこれらをphpプログラムの中でどうやって指定するかですが、改行なら「"¥n"」やタブなら「"¥t"」という記号を使います。例えば次のような感じです。

  $hogehoge = explode("¥n",$motodata);

 $motodata(元データ)には「改行」を含んだデータが入っているとします。それを「"¥n"」つまり「改行」で分割して配列に設定しています。要は入力されたデータを1行ごとに配列に入れているイメージです。
 この時大事なことを一つ。ここで確認した「改行」や「タブ」の記号は「'」(シングルコーテーション)ではなく、「"」(ダブルコーテーション)で囲まれている、ということです。
 この資料ではphp内では基本的に「'」(シングルコーテーション)を使い、html内では「"」(ダブルコーテーション)を使ってきましたが、実は両方使えます。なぜそうしなかったかというと混乱を避けるため。超入門なので話を単純化していました。
 でも両者が「同じか」というとそうではありません。「'」(シングルコーテーション)は「設定された文字列をまったくそのままの文字列として取り扱う場合」に使い、「"」(ダブルコーテーション)は「特殊な記号などの場合にその意味に応じた内容に変換して取り扱う場合」に使います。
 例えば、「$abc=3」とした上で「'」(シングルコーテーション)を使って「echo '答えは$abcです';」を実行すると「答えは$abcです」とそのまま表示されます。ですが「"」(ダブルコーテーション)を使って「echo "答えは$abcです";」を実行すると「答えは3です」と表示されます。つまり、「"」(ダブルコーテーション)を使うと変数の中身が変換(展開)されて表示されるわけです。
 「"¥n"」もこの場合の変数$abcと同様になります。もし上の例でexplode()関数に「'」(シングルコーテーション)で囲まれた「'¥n'」を指定した場合、「日本¥nアメリカ¥nカナダ」と書かれた文字列なら分割できますが、行を分けて入力されたデータ(項目ごとに改行されたデータ)は分割することができません。というわけで「改行」や「タブ」の記号を使う場合は、「"」(ダブルコーテーション)で囲んで、改行なら「"¥n"」やタブなら「"¥t"」と入力する必要があります。これらは区切り文字としてよく使うので、覚えておいて損はないと思います。

 ちょっと話がそれましたが、ここではとりあえずカンマ区切りのサンプルを動かしてみましょう。localhost経由でkihon07.htmlにアクセスし、カンマ区切りの文字列、例えば、「一郎,二郎,三郎」を入力してみて下さい。kihon07.phpで「一郎」「二郎」「三郎」が改行されて表示されましたか?

  

 「一郎,二郎,三郎」でうまくいったら、次は試しに「一郎,二郎,三郎,四郎,五郎」と入れてみて下さい。「三郎」までしか表示されないはずです。あるいは「一郎,二郎」とだけ入力してみて下さい。今度はエラーが出るのではないでしょうか?

  

 なぜだかわかりますか?それは、サンプルの後半のforループが固定で3回繰り返すことになっているからです。カンマ区切りの文字データを4つ以上入力しても3つまでしか表示されず、データが2つ以下だと「$gakuseilist[2]」にデータが入らないため「データがないよ」とエラーが出ます。ではどうするか?配列の要素数をカウントしてその数だけ繰り返すようにすればいいわけです。次でその方法を見ていきましょう。

5. 要素数を調べるcount()

 「count()」関数を使うことで、配列にいくつ要素があるかを調べることができます。インデックス配列でも連想配列でもイケます。配列の要素をforループなどで処理したい場合、配列の要素数が分かれば便利です。方法は簡単。次のサンプルで確かめましょう。

  kihon07.php(php部分以外は省略)
  

 説明します。最初の3行は先に見たサンプルと同じ。4行目からです。
 4行目では「$yososu = count( $gakuseilist );」となっていますが、これは「count()」関数を用いて配列$gakuseilistの要素数をカウントし、その結果を$yososuに代入する、という処理になっています。例えば、配列$gakuseilistの要素として、$gakuseilist[0]~$gakuseilist[5]までデータが入力されている場合、キーで言うと「0」から「5」まで6つあるわけですので、「count( $gakuseilist )」の結果は6となります。そして$yososuには数値の「6」が設定されます。つまり、入力されたデータによって配列$gakuseilistの要素数が変わり、「count()」関数の結果も変わるわけです。
 その上でforループです。ここでの設定は「$i=0」から始めて$iを1ずつ増やし「$i<$yososu」の間、{ }内の「echo $gakuseilist[$i].<br>';」を繰り返す、ということになっています。$yososuは、その前の「count()」関数の結果であり、配列gakuseilistの要素数ですので、配列の要素の数だけ繰り返す、という意味になります。つまり、入力されたデータの数だけ繰り返し、すべてのデータを表示することになります。
 というわけで実際の動作を試しましょう。kihon07.htmlをlocalhost経由で表示させデータを入力して送信してみて下さい。入力データに応じて表示行が変わりますか?プログラムをよく確かめて理解を深めましょう。

  

6. 配列の全要素分foreachで繰り返す

 配列の要素をforループで1件ずつ処理する方法について確かめました。ただ配列のすべての要素をまとめて処理するなら「foreach」命令が便利です。これは配列処理専用の繰り返し命令で、指定された配列のすべての要素を1つずつ取り出して処理するということができます。以下のサンプルを見ましょう。


SPONSORED LINK



  kihon07.php(php部分以外は省略)
  

 変更したのは4行目から。一つ前のサンプルで要素数をカウントする行以降をforeach文に置き換えています。ちょっとスッキリしたように見えるのは気のせいではありません。
 これを実行すると、foreach()に指定された配列「$gakuseilist」から最初の要素が1件取り出され「$value」に格納されます。そして続く{ }内のecho命令で「$value」の内容が改行タグとともに出力されます。{ }内の処理が終わるとまた配列「$gakuseilist」から次の要素が1件取り出され「$value」に格納。続く{ }内のecho命令で出力されます。{ }内の処理が終わると配列「$gakuseilist」からさらに次の要素が1件取り出され・・・と配列の最後の要素まで処理が繰り返されます。結果は一つ前のサンプルの出力結果と同じです。
 つまり「foreach」は、配列のすべての要素を1件ずつ取り出して処理し、最後の要素まで繰り返すという命令になります。ですので配列の要素数を調べる必要がなくなりプログラムがスッキリした、というわけです。でも結果は同じ。素晴らしい。foreach文の構造は次のようになっています。

  foreach ( $配列 as $値用変数 ) { 繰り返し処理 };

 この基本構造を見てforeachループを説明すると、まず「$配列」の要素を1つ取り出し、値を「$値用変数」に代入し、{ }内の繰り返し処理を実行。処理完了したら「$配列」の次の要素を1つ取り出し、値を「$値用変数」に代入し、繰り返し処理を実行・・・と「$配列」の最後の要素まで繰り返す、という動きになります。サンプルプログラムとよく見比べて下さい。
 ところで、$gakuseilistは、数値をキーとしたインデックス配列ですが、このキーも「データとして使いたい」ということがあります。例えば、データの番号として表示するようなケースです。このような場合、配列のキーを取り出して使うことができます。書き方は次の通りです。

  foreach ( $配列 as $キー用変数 => $値用変数 ) { 繰り返し処理 };

 上の書き方との違いをよく確認して下さい。「$キー用変数」と記号「=>」が追加されています。このforeach文では、「$配列」の要素を1つ取り出し、キーを「$キー用変数」に、値を「$値用変数」に代入して繰り返し処理を実行し、処理が終わったら「$配列」の次の要素を1つ取り出し、キーを「$キー用変数」に、値を「$値用変数」に代入して繰り返し処理を実行・・・と配列の最後の要素まで繰り返していくことを想定しています。
 キーと値を格納する変数の間の記号「=>」ですが、これは比較演算子のように見えて全然違うものです。左辺と右辺の大小とは全く関係ありません(ちなみに比較演算子は「>=」と「<=」でした)。ここでの「=>」はむしろ「」(右矢印)に近い。つまり「このキーならこの値」という感じです。
 とはいえこれではピンとこないかもですので具体例で確かめましょう。上のサンプルをさらに以下のように修正して下さい。修正箇所は4行目のforeach文と6行目のecho文です。

  kihon07.php(php部分以外は省略)
  

 まず4行目。「foreach ( $gakuseilist as $key => $value)」と修正しました。これは、変数「$gakuseilist」から要素を1つ取り出し、キーを「$key」に、値を「$value」に格納する、という意味になります。ところで、これらの変数「$key」と「$value」は別の変数でも構いません。ただわかりやすいためか、foreach文でキーと値を格納する変数はこの2つがよく使われます。一つ前のサンプルも値を格納する変数は「$value」でした。
 そして6行目。繰り返し処理のecho文も修正され、$keyの内容が出力されるようになっています。インデックス配列ですので、キーは[0]→[1]→[2]・・・が設定されています。
 というわけで、これをlocalhost経由で実行すると次のようになります。

  

  

7. ループを止めるbreak

 回転寿司で全種類制覇を目指したが途中でやめたくなった、ということはよくありますが(ないか)、これと同じことがプログラムの繰り返し処理でも起きます。例えば、配列に入ったデータの中からある値に一致するデータを取り出すような、いわば検索処理的なプログラムを作る場合、対象データが見つかったらループを終わらせたい、というような状況です。特にforeachループは、指定された配列のすべての要素を処理することを想定しているため、必要に応じて途中で止められることは重要です。
 そして、ループを途中で止める場合に使えるのが「break」命令です。foreachで使えるのはもちろん、forやdo whileとかでも使えます。ここではforeachループのサンプルで確かめましょう。修正点はforeachの{ }内。echo命令の後にif文を4行分追加しています。

  kihon07.php(php部分以外は省略)
  

 説明します。4行目のforeach文まではOK。postメソッドで受け取った文字列データを「,」(カンマ)区切りで分割して配列$gakuseilistに設定。foreachループで、$gakuseilistの要素を順に1つずつ取り出し、キーを$keyに、値を$valueに格納して続く{ }内を実行する、という処理になります。
 そしたforeachループの{ }内。まずecho命令でキーと値を結合して表示しているのは一つ前のサンプルと同じ。追加したのはその後のif文です。
 このif文。条件は「$value=='以上'」。このとき「break」命令が指定されています。ですので「もし$valueの値が'以上'という文字列に等しいならbreak命令でこのforeachループは終了」ということになります。配列の要素がもっとあっても、それ以上処理されることはありません。
 ということで実際にやってみましょう。localhost経由でアクセスし「太郎,次郎,花子,以上,三郎, 五郎」といった「,」(カンマ)区切りのデータを入力してみて下さい。間違いがなければ「以上」まで表示されてその後は表示されないはずです。うまくいったら「以上」の位置を変更して、それでも「以上」のところまで表示されて止まるか確かめてみて下さい。

  

  

8. 配列の追加、結合方法と他の関数

 ここまでインデックス配列の定義やデータの設定方法を確認してきました。ただ、後から配列に要素を追加したくなったり、配列と配列を結合したくなることがあります。あるいは、配列を削除したり、並べ替えたり、取り出したり、順番を詰めたり・・いろいろな操作が必要になることもあるでしょう。だたここですべて紹介することはできないので、配列の追加と結合の方法の主なものだけ確認し、それ以外はこういうのがあるよ、ということだけご紹介します。

[]を使って要素を追加する方法
 配列のキーを入れる四角カッコ「[]」の中を未入力にしたまま(つまり配列のキーを指定せず)に、その配列にデータを代入するという方法です。これにより、配列の最後に要素が1つ追加され、そこにデータが格納されます。例えば、配列$hoge[0]~$hoge[3]まであるときに以下のサンプルの文を実行すると、$hoge[4]に「六郎」という文字列が代入されます。forループなど繰り返し処理の中で使い、データを1つずつ配列に追加登録していくような処理で使われます。

  

array_push()関数を使って追加する方法
 配列の最後に要素を追加する点は上記の「[]を使う方法」と同じですが、こちらは複数の要素を一度に追加できます。例えば、配列$hoge[0]~$hoge[3]まであるときに以下のサンプルを実行すると、$hoge[4]に「六郎」、$hoge[5]に「七郎」と登録されます。

  

array_merge()関数を使って配列を結合する方法
 配列に要素を追加するのではなく、配列に配列を追加する、配列と配列を結合する方法です。例えば、配列$aa[0]~$aa[2](要素3つ)、配列$bb[0]~$bb[1](要素2つ)、配列$cc[0]~$cc[3](要素4つ)があるとき、以下のサンプルを実行すると、すべての要素が結合されて、配列$hogeは、$hoge[0]~$hoge[8]の9つの要素の配列となります。

  

その他の関数
 配列の操作はもちろんこれだけではありません。ざっとあげると、配列の先頭に追加するarray_unshift()関数、配列の先頭を削除して詰めるarray_shift()関数、配列の末尾の要素を削除するarray_pop()関数、配列の要素を削除して詰めるarray_splice()関数、配列の要素を削除するが詰めないunset()関数、配列の中で重複した値を削除して詰めるarray_unique()関数、複数の配列を比較して差分を残すarray_diff()関数、配列の要素をつなげて一連の文字列にするimplode()関数(文字列を分割して配列に入れるexplode()関数の逆です)、配列の合計を計算するarray_sum()関数、配列の値を検索するarray_search()関数、配列の要素を逆順にするarray_reverse()関数・・・。まだありますが「相当いろいろできる」ということがわかると思います。必要に応じて調べてみて下さい。

9. 連想配列の定義と繰り返し

 ここまで確認してきたのは、キーが数値になったインデックス配列でした。ですが上の方でも見たように、配列にはキーにフレーズを使った連想配列もあります。例えば次のような感じで使うわけです。連想配列に文字列データを代入しています。これは見るだけでOKです。


SPONSORED LINK



  

Array()関数による連想配列の定義
 キーがフレーズ(文字列)になっていて、この例なら「日曜のメニューは寿司で、月曜のメニューはカレーで・・」ということがなんとなく読み取れますよね。つまりキーにも意味を持たせることができるわけです。でもやはり1行ずつ書くのは面倒。ということで連想配列でも「array()」関数が使えます。

  kihon07.php(対象箇所のみ)
  

 上の1行ずつ指定する方法との対応をよく見て下さい。次のようになっていることがわかりますか?

  $menu = array('Sunday'=>'寿司','Monday'=>'カレー');

 キーフレーズと入力データが「=>」で結ばれています。この書き方。上の方で見たforeach文で、配列からキーと値を取り出すときにもありましたよね。それと同じです。大小の比較演算子ではなく「⇒」(右矢印)のイメージです。「このキーには⇒この値」みたいな感じです。
 ではこのような連想配列の要素をforループで1件ずつ取り出すことはできるでしょうか?難しそうですよね?インデックス配列のようにキーが数値ではないのでforループのカウント数で指定して取り出すということはできなさそうです。というわけでここでも「foreach」を使います。

foreachによる繰り返し
 「foreach」は配列処理専用の繰り返し命令で、指定された配列のすべての要素を1つずつ取り出して処理するものです。連想配列でも使えます。すでに詳しい説明は上でしているので大丈夫と思いますが、もしダメなら戻って確認して下さい。
 とはいえ連想配列の場合もサンプルで確認しましょう。以下は上記サンプルのarray()関数で連想配列を定義した後を想定しています。

  kihon07.php(対象箇所のみ)
  

 このサンプルでは、foreach文によって、連想配列$menuのすべての要素が1つずつ$valueに入れられ、{ }内で処理されていきます。具体的には、まず1つ目の要素が取り出されその値が「メニュー:寿司」として表示され、次に2つ目の要素が取り出されその値が「メニュー:カレー」として表示され・・・と最後の要素まで繰り返されます。

  

 一方でもちろん配列のキーも取り出すことができます。特に連想配列の場合はキーが意味を持つことが多いのでこれもデータとして使えると便利です。キーの取り出し方は連想配列でも同じです。foreach()にキーを格納する変数と「=>」という記号を追加するだけです。サンプルを見ましょう。

  kihon07.php(対象箇所のみ)
  

 変更点。foreach()にキーを格納する変数として「$key」がありその後に「=>」という記号がありますよね。上で見た通り「このキーにはこの値」というイメージです。処理内容としては、連想配列$menuのすべての要素を1つずつ取り出し、キーを$keyに、値を$valueに入れて{ }内の処理を行っていく、ということです。結果としては「Sundayのメニュー:寿司」「Mondayのメニュー:カレー」「Tuesdayのメニュー:パスタ」・・という具合に行を分けて表示されます。連想配列でも同じですね。

  

 ただ連想配列は、もちろんインデックス配列のような数値の「番号」を持ちません。ので「番号を使った処理はできない?」と思うかもしれませんが、少し工夫すれば実現できます。例えば、繰り返し回数をカウントする変数を設定して、その値に応じて処理すれば「番号を表示する」ことや「10番目の要素から20番目の要素までを処理する」ことができるわけです。これは参考までに以下サンプルを見ておいて下さい。

  

 わかりますか?foreachループは配列の全要素を順に処理していきますが、このサンプルでは最初に「$kaisu=0;」を設定して、繰り返すたびに「$kaisu++;」で$kaisuの値を1ずつ増やしていきます。つまり、$kaisuの値は、現在対象としている配列の要素が何番目の要素かを表すことになります。そしてこのサンプルでは、その$kaisuの値が「1以上2以下」のとき、具体的には「1番Mondayのメニュー:カレー」「2番Tuesdayのメニュー:パスタ」が表示されることになります。foreachは、そもそも配列の全要素を対象としているので工夫次第で様々な処理を実現できます。

10. チェックボックスから読み込む方法

 HTMLの<input type="checkbox">によって作られた複数選択可能なチェックボックスからのデータの受け取り方法です。テキストエリアやラジオボタンによって入力されたデータの受け渡しについては基本編・データ受渡しと変数で確認しましたが、チェックボックスの場合は配列の知識が必要なので先延ばししてました。サンプルで確かめましょう。

  kihon07.html(送信ボタンの前への追加分のみ)
  

  kihon07.php(対象箇所のみ)
  

 ポイントは第一にHTML。<input type="checkbox">タグのname属性に「iro[]」という名前が指定されています。そう。配列につける「[]」がデータの名前につけられています。つまり、複数データを配列に入れて送る、というイメージです。
 第二にPHP。一見普通です。postメソッドで普通にデータを受け取り、変数に代入しているように見えます。ですがこれ、配列としてデータを受け取っています。代入される変数$iroは配列になります。
 ですのでこのサンプルHTMLのチェックボックスで「好きな色」として例えば「あか」と「き」が選択されたとします。するとこの受け取り側PHPでは、配列$iroに、$iro[0]に「赤」、$iro[1]に「黄」が格納されます。チェックボックスは複数選択でいくつ選択されるかわかりませんので配列で受け取る必要がある、ということです。
 そしてそのうえで、上で見たforeachループです。配列$iroのすべての要素を1つずつ取り出して処理していきます。「あか」と「き」が選択された場合は要素は2つしかありませんが、このサンプルではこの2つすべてについてecho命令で改行とともに表示していくわけです。

  

  

(参考) 多次元配列

 この資料で見てきた配列は、いずれもキーが1つでした。つまり配列の「[]」が1つだけでした。ですが実はこの「[]」、複数つけることができます。例えば、次のように「[][]」と2つつければ二次元配列になります。

  (php部分以外は省略)
  

 キーフレーズが2つついていますよね?これは連想配列の二次元配列ですが、キーを数値にすればインデックス配列でもイケます。あるいはキーが2つ以上に増えれば多次元配列も可能です。もちろん配列のキーが複数ついているというだけで各種の関数も使えます。ただやはり少し複雑なので二次元配列はたまに見ますが、それ以上の多次元配列はそれほど使わないような気がします。
 また多次元配列にしなくても、このサンプルのように「曜日×昼・夜」ぐらいのデータであれば、昼メニューの配列「$hirumenu[]」と夜メニューの配列「$yorumenu[]」を作ってキーを「Sunday」「Monday」・・と統一してあげれば同じことができます。
 この資料は超入門なので参考まで、ということで、多次元配列があることだけ覚えていただいて、必要があれば各自調べていただくことにしたいと思います。


練習問題

 このページで用いたファイルkihon07.htmlとkihon07.phpを使い、以下の課題に取り組みましょう。
  1. kihon07.htmlを編集し、すでにあるテキストエリア(<textarea name="gakusei">)のメッセージを「データ(改行区切りで入力して下さい)」と修正した上で、kihon07.phpを編集し受け取った「改行区切りのデータ」を「改行」で分割して処理されるようにせよ。
  2. さらにkihon07.phpを編集し、次のデータが入力された際に、$gakuseilistの要素として格納されたデータを「<>」でexplode関数を使って分割して、配列$seisekiに代入し、「名前:~、学年:~、点数:~」と表示されるようにせよ。(ヒント:3つのデータに分割されて$seisekiに設定された場合、各要素には$seiseki[0]、$seiseki[1]、$seiseki[2]としてアクセスできる)。
      
練習問題の出力例

関連リンク



SPONSORED LINK





ページのトップへ戻る
SPONSORED LINK