Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
PHP
入門編
- トップページ
- PHP入門編 - 配列数に合わせた繰り返し処理を行うforeach文について
配列数に合わせた繰り返し処理を行うforeach文について
みなさまどうも。いかがお過ごしでしょうか。
さて、当記事がPHP入門編最後の項目となります。最初からお読みいただいた方は大変お疲れ様でした。このような駄文をここまでお読み頂き大変嬉しゅうございます。少しでも貴方様の知力となっていれば幸いです。
では改めまして『foreach文』っていうのをやっていきましょう。『foreach文』は配列数に合わせたループ処理が行える構文になります。
通常、配列のループ処理と言えばfor文となるわけでございますが、キチッとした純粋な添字配列を生成しづらいPHPでは『foreach文』を使用する機会が非常に多いです。なのでバシッと使いこなしてしまいましょう。
まず『foreach文』の基本的な構文を日本語まじりで書くと以下のような感じになります。
foreach(配列 as 変数){ // ここに処理かきます。 }
長々とした日本語で書くと以下のような感じです。
foreach(繰り返し処理の元となる配列 as 繰り返される配列の各要素の値を一時的に収める変数){ // ここに処理かきます。 }
細かくみていきましょう。まず『foreach』と書き、その横に『()』を書きます。この『()』の中に『繰り返しの元となる配列』と、『配列から取り出した要素の値を一時的に収める変数』を『as』を挟んで記述してあげます。『as』の左側が配列、右側が変数になりますね。
実際のソースコードは以下のような感じです。またボカロのみなさんのお名前をお借りしちゃいます。
<?php $vocaloids[] = '初音ミク'; $vocaloids[] = 'IA'; $vocaloids[] = '鏡音リン'; foreach($vocaloids as $val){ echo $val; }
この場合は配列『vocaloids』の要素数は3つです。なので『foreach文』も3回実行されます。そしてその各要素の値、『初音ミク』、『IA』、『鏡音リン』が繰り返しの度に変数『val』に収まる形になります。ですので、これを実行させると以下となります。
初音ミクIA鏡音リン
ここまでは大丈夫そうでしょうか。PHPでの配列の順番は必ず担保されますので添字配列だろうが連想配列だろうがちゃんと順番通りに処理してくれます。
さて、「配列のキー(インデックス)も取り出して処理したいぜぇ」という場合は『=>』を使って以下のようにします。
foreach(配列 as キーを入れる変数 => 値を入れる変数){ // ここに処理かきます。 }
こうすることでキー(インデックス)も取得することができます。先ほどのソースコードを加工してみたので以下を確認してみてください。
<?php $vocaloids[] = '初音ミク'; $vocaloids[] = 'IA'; $vocaloids[] = '鏡音リン'; foreach($vocaloids as $key => $val){ echo '配列『vocaloids』のキー『' . $key . '』は『' . $val . "』です。\n"; }
これを出力させてみるとこうなります。
配列『vocaloids』のキー『0』は『初音ミク』です。 配列『vocaloids』のキー『1』は『IA』です。 配列『vocaloids』のキー『2』は『鏡音リン』です。
連想配列でも同じように処理ができます。以下のサンプルを確認してみましょう。
<?php $vocaloids['miku'] = '080-xxxx-1234'; $vocaloids['IA'] = '090-yyyy-1234'; $vocaloids['rin'] = '080-zzzz-1234'; foreach($vocaloids as $key => $val){ echo '配列『vocaloids』のキー『' . $key . '』は『' . $val . "』です。\n"; }
実行させるとこうなります。
配列『vocaloids』のキー『miku』は『080-xxxx-1234』です。 配列『vocaloids』のキー『IA』は『090-yyyy-1234』です。 配列『vocaloids』のキー『rin』は『080-zzzz-1234』です。
間違いやすいところといえばキー(インデックス)と値を逆にしてしまうというところがあります。しかし、これについてはすぐに気付けるところなので特に心配しなくても問題ないです。「やべっ逆に書いちまった!」ってなったらささっと直しちゃってください。
さて、では練習がてら、ちょっと前に書いた『とあるおっさんの一日』のウェブサイトを無駄に配列と『forecch文』を使って書きなおしてみましょう。
まず適当に配列を定義し、そこに時間ごとのメッセージを突っ込んであげます。『date()』の『H』で取れる時間が一桁だった場合は『07』というように頭に『0』が付き、『00』~『23』までの値が返ってくるのでそれに合わせて定義してあげます。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>とあるおっさんの一日</title> </head> <body> <?php $messages = array( '00' => '...。', '01' => '...。', '02' => '...。', '03' => '...。', '04' => '...。', '05' => '...。', '06' => '...。', '07' => '...。', '08' => '起きた。多少二日酔いだが動けなくはない。しかししょっぱなから飛ばすと後でバテる。とりあえずコーヒーを飲んで目を覚ますことに専念すべき。9時から本気出す。', '09' => '...。', '10' => '...。', '11' => 'しまった。ニコ動を見ていたら数時間たっていた。しかしまだ慌てる時間じゃない。12時から本気出す。', '12' => '世間はランチの時間だ。お腹も空いてきた。区切りの良い12時という時刻を逃すのは惜しいが、社会の流れと自分の時間を合わせることは非常に重要だ。まだ一日は長い。ここはランチを済ませることにしよう。13時から本気出す。', '13' => '...。', '14' => '...。', '15' => 'しまった。たらふく食べたらなんだか眠くなってしまい、ついうたた寝をしてしまった。しかし寝起きですぐ動くと体に悪い。まだ一日は長い。16時から本気出す。', '16' => '昼寝しすぎた影響か体がだるい。無理しても効果がないのでここは雌伏の時。まだ夜は始まったばかり。17時から本気出す。', '17' => '...。', '18' => '...。', '19' => '...。', '20' => '...。', '21' => 'しまった。ゲームをやっていたらこんな時間になっていた。この時間から頑張るのも良いが世間はディナーの時間だ。社会の流れと自分の時間を合わせることは非常に重要だ。ここはディナーを済ませることにしよう。22時から本気出す。', '22' => '...。', '23' => 'しまった。ビールを飲んでいたらこんな時間になってしまった。非常に残念だが今日はチャンスがなかった。悔しいので2chに「充実した一日だった」と書き込んでおこう。明日から本気出す。' ); ?> </body> </html>
続いて『time()』で『UNIX time』を取得して『date()』でフォーマットを揃えてあげます。前の記事では『date()』で取得した文字列を『intval()』をつかって数値に変換するという処理を入れましたが、今回は文字列同士の比較となりますのでその必要はありません。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>とあるおっさんの一日</title> </head> <body> <?php $messages = array( '00' => '...。', '01' => '...。', '02' => '...。', '03' => '...。', '04' => '...。', '05' => '...。', '06' => '...。', '07' => '...。', '08' => '起きた。多少二日酔いだが動けなくはない。しかししょっぱなから飛ばすと後でバテる。とりあえずコーヒーを飲んで目を覚ますことに専念すべき。9時から本気出す。', '09' => '...。', '10' => '...。', '11' => 'しまった。ニコ動を見ていたら数時間たっていた。しかしまだ慌てる時間じゃない。12時から本気出す。', '12' => '世間はランチの時間だ。お腹も空いてきた。区切りの良い12時という時刻を逃すのは惜しいが、社会の流れと自分の時間を合わせることは非常に重要だ。まだ一日は長い。ここはランチを済ませることにしよう。13時から本気出す。', '13' => '...。', '14' => '...。', '15' => 'しまった。たらふく食べたらなんだか眠くなってしまい、ついうたた寝をしてしまった。しかし寝起きですぐ動くと体に悪い。まだ一日は長い。16時から本気出す。', '16' => '昼寝しすぎた影響か体がだるい。無理しても効果がないのでここは雌伏の時。まだ夜は始まったばかり。17時から本気出す。', '17' => '...。', '18' => '...。', '19' => '...。', '20' => '...。', '21' => 'しまった。ゲームをやっていたらこんな時間になっていた。この時間から頑張るのも良いが世間はディナーの時間だ。社会の流れと自分の時間を合わせることは非常に重要だ。ここはディナーを済ませることにしよう。22時から本気出す。', '22' => '...。', '23' => 'しまった。ビールを飲んでいたらこんな時間になってしまった。非常に残念だが今日はチャンスがなかった。悔しいので2chに「充実した一日だった」と書き込んでおこう。明日から本気出す。' ); $time = time(); // アクセス時間の『UNIX time』を変数に代入します。 $chr_h = date('H', $time); // 文字列同士の比較になるのでそのまま代入します。 ?> </body> </html>
そしたらアクセス時間をp要素で出力してあげましょう。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>とあるおっさんの一日</title> </head> <body> <?php $messages = array( '00' => '...。', '01' => '...。', '02' => '...。', '03' => '...。', '04' => '...。', '05' => '...。', '06' => '...。', '07' => '...。', '08' => '起きた。多少二日酔いだが動けなくはない。しかししょっぱなから飛ばすと後でバテる。とりあえずコーヒーを飲んで目を覚ますことに専念すべき。9時から本気出す。', '09' => '...。', '10' => '...。', '11' => 'しまった。ニコ動を見ていたら数時間たっていた。しかしまだ慌てる時間じゃない。12時から本気出す。', '12' => '世間はランチの時間だ。お腹も空いてきた。区切りの良い12時という時刻を逃すのは惜しいが、社会の流れと自分の時間を合わせることは非常に重要だ。まだ一日は長い。ここはランチを済ませることにしよう。13時から本気出す。', '13' => '...。', '14' => '...。', '15' => 'しまった。たらふく食べたらなんだか眠くなってしまい、ついうたた寝をしてしまった。しかし寝起きですぐ動くと体に悪い。まだ一日は長い。16時から本気出す。', '16' => '昼寝しすぎた影響か体がだるい。無理しても効果がないのでここは雌伏の時。まだ夜は始まったばかり。17時から本気出す。', '17' => '...。', '18' => '...。', '19' => '...。', '20' => '...。', '21' => 'しまった。ゲームをやっていたらこんな時間になっていた。この時間から頑張るのも良いが世間はディナーの時間だ。社会の流れと自分の時間を合わせることは非常に重要だ。ここはディナーを済ませることにしよう。22時から本気出す。', '22' => '...。', '23' => 'しまった。ビールを飲んでいたらこんな時間になってしまった。非常に残念だが今日はチャンスがなかった。悔しいので2chに「充実した一日だった」と書き込んでおこう。明日から本気出す。' ); $time = time(); // アクセス時間の『UNIX time』を変数に代入します。 $chr_h = date('H', $time); // 文字列同士の比較になるのでそのまま代入してOKです。 echo '<p>アクセス時間: ' . date('H時i分s秒', $time) . '</p>'; // アクセス時間をp要素で出力します。 ?> </body> </html>
続いてメッセージ用のp要素の開始タグと終了タグを出力します。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>とあるおっさんの一日</title> </head> <body> <?php $messages = array( '00' => '...。', '01' => '...。', '02' => '...。', '03' => '...。', '04' => '...。', '05' => '...。', '06' => '...。', '07' => '...。', '08' => '起きた。多少二日酔いだが動けなくはない。しかししょっぱなから飛ばすと後でバテる。とりあえずコーヒーを飲んで目を覚ますことに専念すべき。9時から本気出す。', '09' => '...。', '10' => '...。', '11' => 'しまった。ニコ動を見ていたら数時間たっていた。しかしまだ慌てる時間じゃない。12時から本気出す。', '12' => '世間はランチの時間だ。お腹も空いてきた。区切りの良い12時という時刻を逃すのは惜しいが、社会の流れと自分の時間を合わせることは非常に重要だ。まだ一日は長い。ここはランチを済ませることにしよう。13時から本気出す。', '13' => '...。', '14' => '...。', '15' => 'しまった。たらふく食べたらなんだか眠くなってしまい、ついうたた寝をしてしまった。しかし寝起きですぐ動くと体に悪い。まだ一日は長い。16時から本気出す。', '16' => '昼寝しすぎた影響か体がだるい。無理しても効果がないのでここは雌伏の時。まだ夜は始まったばかり。17時から本気出す。', '17' => '...。', '18' => '...。', '19' => '...。', '20' => '...。', '21' => 'しまった。ゲームをやっていたらこんな時間になっていた。この時間から頑張るのも良いが世間はディナーの時間だ。社会の流れと自分の時間を合わせることは非常に重要だ。ここはディナーを済ませることにしよう。22時から本気出す。', '22' => '...。', '23' => 'しまった。ビールを飲んでいたらこんな時間になってしまった。非常に残念だが今日はチャンスがなかった。悔しいので2chに「充実した一日だった」と書き込んでおこう。明日から本気出す。' ); $time = time(); // アクセス時間の『UNIX time』を変数に代入します。 $chr_h = date('H', $time); // 文字列同士の比較になるのでそのまま代入してOKです。 echo '<p>アクセス時間: ' . date('H時i分s秒', $time) . '</p>'; // アクセス時間をp要素で出力します。 echo '<p>'; // メッセージ用のp要素の開始タグを出力します。 echo '</p>'; // メッセージ用のp要素の終了タグを出力します。 ?> </body> </html>
さて、あとは時間に合わせたメッセージを出力する処理を構築すればOKなので今回解説した『foreach文』を無駄に使って照らし合わせ処理をいれてみましょう。
ちょいと『foreach文』のところだけ抜き出して解説していきます。
連想配列『messages』の中に各時間ごとのメッセージが要素として収まっているわけでございますが、ということは現在時間が文字列で収まっている変数『chr_h』と連想配列『messages』のキーを照らしあわせて一致していれば出力する、という処理にすれば良いです。
まず『foreach文』をカキカキして
foreach(){ }
連想配列『messages』でループ処理するように記述します。キーと値は変数『key』と変数『val』で受け取ってくれるようにしましょう。
foreach($messages as $key => $val){ }
そしたら変数『chr_h』と変数『key』で比較処理を行い、それが一致したら変数『val』を出力するという処理を追加します。
foreach($messages as $key => $val){ if($chr_h === $key) echo $val; // 変数『chr_h』と変数『key』が一致したら変数『val』を出力する。 }
はい、ここでちょっと注意点です。PHPでの連想配列のキーを取り出した場合、10進数として解釈できる場合は勝手に数値に変換するという気持ち悪いなんとも言えない処理が裏側で行われます。
ちょっと実験してみましょう。先ほどの『foreach文』の変数『key』を『var_dump()』で出力するようにしてみます。
<?php $messages = array( '00' => '...。', '01' => '...。', '02' => '...。', '03' => '...。', '04' => '...。', '05' => '...。', '06' => '...。', '07' => '...。', '08' => '起きた。多少二日酔いだが動けなくはない。しかししょっぱなから飛ばすと後でバテる。とりあえずコーヒーを飲んで目を覚ますことに専念すべき。9時から本気出す。', '09' => '...。', '10' => '...。', '11' => 'しまった。ニコ動を見ていたら数時間たっていた。しかしまだ慌てる時間じゃない。12時から本気出す。', '12' => '世間はランチの時間だ。お腹も空いてきた。区切りの良い12時という時刻を逃すのは惜しいが、社会の流れと自分の時間を合わせることは非常に重要だ。まだ一日は長い。ここはランチを済ませることにしよう。13時から本気出す。', '13' => '...。', '14' => '...。', '15' => 'しまった。たらふく食べたらなんだか眠くなってしまい、ついうたた寝をしてしまった。しかし寝起きですぐ動くと体に悪い。まだ一日は長い。16時から本気出す。', '16' => '昼寝しすぎた影響か体がだるい。無理しても効果がないのでここは雌伏の時。まだ夜は始まったばかり。17時から本気出す。', '17' => '...。', '18' => '...。', '19' => '...。', '20' => '...。', '21' => 'しまった。ゲームをやっていたらこんな時間になっていた。この時間から頑張るのも良いが世間はディナーの時間だ。社会の流れと自分の時間を合わせることは非常に重要だ。ここはディナーを済ませることにしよう。22時から本気出す。', '22' => '...。', '23' => 'しまった。ビールを飲んでいたらこんな時間になってしまった。非常に残念だが今日はチャンスがなかった。悔しいので2chに「充実した一日だった」と書き込んでおこう。明日から本気出す。' ); foreach($messages as $key => $val){ var_dump($key); }
これを実行するとこうなります。
string(2) "00" string(2) "01" string(2) "02" string(2) "03" string(2) "04" string(2) "05" string(2) "06" string(2) "07" string(2) "08" string(2) "09" int(10) int(11) int(12) int(13) int(14) int(15) int(16) int(17) int(18) int(19) int(20) int(21) int(22) int(23)
『00』~『09』までは文字列で、10進数として解釈できる『10』~『23』までは数値で返ってくるという処理になっていますね。
なので厳密な比較を行いたい場合は変数『chr_h』に合わせて変数『key』を文字列にする必要があったりします。というわけで文字列に変換してくれる『strval()』を使用して変数『key』を文字列にしてあげましょう。
foreach($messages as $key => $val){ if($chr_h === strval($key)) echo $val; // 変数『chr_h』と文字列に変換した変数『key』が一致したら変数『val』を出力します。 }
これでOKです。では先ほどのHTMLソースに組み込みしてみましょう。これが完成形です。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>とあるおっさんの一日</title> </head> <body> <?php $messages = array( '00' => '...。', '01' => '...。', '02' => '...。', '03' => '...。', '04' => '...。', '05' => '...。', '06' => '...。', '07' => '...。', '08' => '起きた。多少二日酔いだが動けなくはない。しかししょっぱなから飛ばすと後でバテる。とりあえずコーヒーを飲んで目を覚ますことに専念すべき。9時から本気出す。', '09' => '...。', '10' => '...。', '11' => 'しまった。ニコ動を見ていたら数時間たっていた。しかしまだ慌てる時間じゃない。12時から本気出す。', '12' => '世間はランチの時間だ。お腹も空いてきた。区切りの良い12時という時刻を逃すのは惜しいが、社会の流れと自分の時間を合わせることは非常に重要だ。まだ一日は長い。ここはランチを済ませることにしよう。13時から本気出す。', '13' => '...。', '14' => '...。', '15' => 'しまった。たらふく食べたらなんだか眠くなってしまい、ついうたた寝をしてしまった。しかし寝起きですぐ動くと体に悪い。まだ一日は長い。16時から本気出す。', '16' => '昼寝しすぎた影響か体がだるい。無理しても効果がないのでここは雌伏の時。まだ夜は始まったばかり。17時から本気出す。', '17' => '...。', '18' => '...。', '19' => '...。', '20' => '...。', '21' => 'しまった。ゲームをやっていたらこんな時間になっていた。この時間から頑張るのも良いが世間はディナーの時間だ。社会の流れと自分の時間を合わせることは非常に重要だ。ここはディナーを済ませることにしよう。22時から本気出す。', '22' => '...。', '23' => 'しまった。ビールを飲んでいたらこんな時間になってしまった。非常に残念だが今日はチャンスがなかった。悔しいので2chに「充実した一日だった」と書き込んでおこう。明日から本気出す。' ); $time = time(); // アクセス時間の『UNIX time』を変数に代入します。 $chr_h = date('H', $time); // 文字列同士の比較になるのでそのまま代入してOKです。 echo '<p>アクセス時間: ' . date('H時i分s秒', $time) . '</p>'; // アクセス時間をp要素で出力します。 echo '<p>'; // メッセージ用のp要素の開始タグを出力します。 foreach($messages as $key => $val){ if($chr_h === strval($key)) echo $val; // 変数『chr_h』と文字列に変換した変数『key』が一致したら変数『val』を出力します。 } echo '</p>'; // メッセージ用のp要素の終了タグを出力します。 ?> </body> </html>
いかがでしたでしょうか。あまりスマートな処理とは言えませんが『foreach文』はこんな感じで使用します。よく使われる構文なのでバッチリマスターしちゃってください。
ちなみに今回作成した処理のメッセージ出力部分はしっかり連想配列が定義されており、そのチェックが必要ないとするならばなんと一行で書けちゃったりします。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>とあるおっさんの一日</title> </head> <body> <?php $messages = array( '00' => '...。', '01' => '...。', '02' => '...。', '03' => '...。', '04' => '...。', '05' => '...。', '06' => '...。', '07' => '...。', '08' => '起きた。多少二日酔いだが動けなくはない。しかししょっぱなから飛ばすと後でバテる。とりあえずコーヒーを飲んで目を覚ますことに専念すべき。9時から本気出す。', '09' => '...。', '10' => '...。', '11' => 'しまった。ニコ動を見ていたら数時間たっていた。しかしまだ慌てる時間じゃない。12時から本気出す。', '12' => '世間はランチの時間だ。お腹も空いてきた。区切りの良い12時という時刻を逃すのは惜しいが、社会の流れと自分の時間を合わせることは非常に重要だ。まだ一日は長い。ここはランチを済ませることにしよう。13時から本気出す。', '13' => '...。', '14' => '...。', '15' => 'しまった。たらふく食べたらなんだか眠くなってしまい、ついうたた寝をしてしまった。しかし寝起きですぐ動くと体に悪い。まだ一日は長い。16時から本気出す。', '16' => '昼寝しすぎた影響か体がだるい。無理しても効果がないのでここは雌伏の時。まだ夜は始まったばかり。17時から本気出す。', '17' => '...。', '18' => '...。', '19' => '...。', '20' => '...。', '21' => 'しまった。ゲームをやっていたらこんな時間になっていた。この時間から頑張るのも良いが世間はディナーの時間だ。社会の流れと自分の時間を合わせることは非常に重要だ。ここはディナーを済ませることにしよう。22時から本気出す。', '22' => '...。', '23' => 'しまった。ビールを飲んでいたらこんな時間になってしまった。非常に残念だが今日はチャンスがなかった。悔しいので2chに「充実した一日だった」と書き込んでおこう。明日から本気出す。' ); $time = time(); // アクセス時間の『UNIX time』を変数に代入します。 $chr_h = date('H', $time); // 文字列同士の比較になるのでそのまま代入してOKです。 echo '<p>アクセス時間: ' . date('H時i分s秒', $time) . '</p>'; // アクセス時間をp要素で出力します。 echo '<p>' . $messages[$chr_h] . '</p>'; // 実はこれだけでOKだったりします。 ?> </body> </html>
こんな感じでより効率的な記述や処理を見つけていくのもまた一興でございますね。
というわけでPHP入門編はこれにて終了でございます。ここまでお読み頂き誠にありがとうございました。次の記事では総まとめをやっていきたいと思いますので忘れてしまった項目などありましたらそちらでチェックしちゃってください。
ではではこの辺で。またお会いしましょう。
この記事は桜舞が執筆致しました。
著者が愛する小型哺乳類 |
桜舞 春人 Sakurama HarutoISDN時代から様々なコンテンツを制作しているちょっと髪の毛が心配な東京在住のプログラマー。生粋のロングスリーパーで、10時間以上睡眠を取らないと基本的に体調が悪い。好きなだけ寝れる生活を送るのが夢。ゲームとスポーツと音楽が大好き。誰か髪の毛を分けて下さい。 |
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。