Language
日本語
English

Caution

JavaScript is disabled in your browser.
This site uses JavaScript for features such as search.
For the best experience, please enable JavaScript before browsing this site.

  1. Home
  2. PHPBeginner - The foreach Loop for Array Iteration

The foreach Loop for Array Iteration - Japanese Only

みなさまどうも。いかがお過ごしでしょうか。

さて、当記事が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入門編はこれにて終了でございます。ここまでお読み頂き誠にありがとうございました。次の記事では総まとめをやっていきたいと思いますので忘れてしまった項目などありましたらそちらでチェックしちゃってください。

ではではこの辺で。またお会いしましょう。

This article was written by Sakurama.

Author's beloved small mammal

桜舞 春人 Sakurama Haruto

A Tokyo-based programmer who has been creating various content since the ISDN era, with a bit of concern about his hair. A true long sleeper who generally feels unwell without at least 10 hours of sleep. His dream is to live a life where he can sleep as much as he wants. Loves games, sports, and music. Please share some hair with him.

If you find any errors or copyright issues, please .