今回はPHPのforeach文についてのお話です
まず以下のような配列と連想配列があるとします。
//配列
$language = array('JavaScript','PHP','HTML');
//連想配列
$week['sun'] = '日曜日';
$week['mon'] = '月曜日';
$week['tue'] = '火曜日';
$week['wed'] = '水曜日';
$week['thu'] = '木曜日';
$week['fri'] = '金曜日';
$week['sat'] = '土曜日';
普通の配列には0番目に『JavaScript』、1番目に『PHP』、2番目に『HTML』という文字がそれぞれ入っています。一方、連想配列の方は0番目、1番目、2番目二入っているのは〜、という形式ではなく、「『sun』に対応するのは『日曜日』、『mon』に対応するのは『月曜日』…」という形式であるキー(キーワード)に対応するデータはこれ、というものを定義しています。
これらの配列と連想配列の中身に対して同じ処理を行う場合にはループを使うのが一般的ですが、このループにも色々と種類があります。for文、while文などですね。
PHPで書かれたソースコードを見ていると、以下のような書き方をよく目にします。
foreach($language as $value) {
echo $value."<br>\n";
}
foreach($week as $key => $value) {
echo "[".$key."] は".$value."です<br>\n";
}
ご存知の方にとっては「ああ、foreach文だな」程度の物なのですが、PHPにあまり触れたことのない方にとっては「なんかfor文っぽいことをしているけど$valueってなに?$keyってどこから出てきたの?」などと混乱してしまうかもしれません。例の上にある普通の配列の場合だと、なんとなく「配列の中身の値が出力されるのかな?」と想像がつくかもしれませんが、例の下の方の連想配列を使ったものについては先に定義してあった$week以外に新しい変数が2つもいきなり登場する、というのがクセ者かもしれません。
ここまで書くと、皆さん御察しの通り、これらはどちらもそれぞれ配列と連想配列の中身を表示しているのですが、まず配列の内容を出力している例をよくあるfor文を使った書いたものと比較してそれぞれの行で何を行っているかを書いてみると
$count = count($language);//$languageの数を数えて
for($i=0;i<$count;$i++){//$iを1ずつ増やしながら、$iが$languageの数より少ない間
echo $language[$i]."<br>\n";//$languageの中身を出力する
}
foreach($language as $value) {//$languageの中身を「それぞれ順番に」$valueという変数に入れて
echo $value."<br>\n";//$valueの中身を出力する
}
//結果はどちらも
JavaScript
PHP
HTML
//となります
同じことを行うのにforeach文を使った方が、より少ない文字数で書けていて、また、意味さえわかってしまえばより人間が理解しやすい書き方になっていると思います。「foreach」というのは配列などのたくさんのデータの集まりの内容の「それぞれに対して順番に」ある処理を行う、ということになります。
これと同じことは連組配列の場合にも言えて、連想配列を使ったものはキーとそれに対応するデータを出力するために以下のようなことをしています。
foreach($week as $key => $value) {//$weekの中身の「それぞれに対して順番に」キーを$keyという変数に、それに対応するデータを$valueという変数に入れて
echo "[".$key."] は".$value."です<br>\n";//「[$key]は$valueです」という形式で出力する
}
//結果は
[sun]は日曜日です
[mon]は月曜日です
[tue]は火曜日です
[wed]は水曜日です
[thu]は木曜日です
[fri]は金曜日です
[sat]は土曜日です
//となります
こちらもその気になればfor文で書き直すことができそうですが(key()やnext()などを使ってキーを取得、それをもとに対応するデータを出力する、など)わざわざfor文でそのような処理を行うのが面倒なくらいこちらのやり方のほうが手軽です。
この連想配列に対して使っていた、foreach($連想配列 as $key => $value){…}という書き方ですが、実はこれは普通の配列に対しても使うことができます。配列は連想配列風に考えると(PHPでは実は全ての配列は連想配列です)以下のようになります。
$language[0] = 'JavaScript';
$language[1] = 'PHP';
$language[2] = 'HTML';
なので、これをforeach文を使って連想配列と同様に
foreach($language as $key => $value) {
echo "配列\$languageの[".$key."] 番目は".$value."です<br>\n";
}
という処理にしてやると以下のような結果になります。
配列$languageの[0]番目はJaveScriptです
配列$languageの[1]番目はPHPです
配列$languageの[2]番目はHTMLです
当然、$keyを無視して先ほどのforeach($language as $value){…}と同じ内容を出力することもできます。
foreach($language as $key => $value) {
echo $value."<br>\n";
}
//結果は
JavaScript
PHP
HTML
このforeachを使った連想配列の処理はPHPでデータベースから取得したデータを処理する際などによく使われるので、連想配列がどのようなものか、ということと一緒に覚えておくと役に立つと思います。