phpを学ぶ上で絶対に欠かせない要素の一つ、変数。この変数を学んでいると、
変数に「配列」っていう形式があるみたいだけど、どんなふうに使うんだろう?
配列形式って扱い方が難しくて苦手……。
結局、変数を何個も用意すればいいんじゃないの?配列形式にする理由がわからないなぁ……。
と、いろいろな疑問だったり扱い方について考えてしまうと思います。
この記事を読めば、
- phpの変数の配列について
- phpの配列の扱い方
- phpの配列を使った「繰り返し(ループ)文」であるfor文の扱い方
について理解することが出来ます。今回は具体的な例を用いて、for文を使って「3人のテストの結果」を表示させます。それでは見てみましょう。
目次
phpの配列(array)は、複数のデータを同じ変数内に入れられる
配列にも種類があり、それぞれ「配列」「連想配列」「多次元配列」と言います。
配列は複数のデータに順番を付けて変数に入れる
配列は複数のデータを入れることができる変数です。
1 |
$member = array('tarou','hanako','kazuo'); |
このように、$memberという変数内に”tarou”と”hanako”、そして”kazuo”という3つの文字列のデータが入っています。変数という箱の中に仕切りを付けてその中にデータを入れているイメージですね。
ちなみに、新しく追加するには、
1 |
$member[] = 'hiroki'; |
としてあげると後ろに追加されます。取り出す際は、
1 |
$member1 = $member[0]; |
とすると一番最初に入っている”tarou”が$member1に入ります。配列の順番は0から始まるので、$member[1]とすると二番目の”hanako”が入ってしまうので注意が必要です。
連想配列は複数のデータを入れる際に入れる場所に名前をつける
1 2 3 4 5 |
$japanese = array( "tarou" => 90, "hanako" => 70, "kazuo" => 50, ); |
この$japaneseという変数には、90,70,50という数値のデータが入っています。左側の”tarou”や”hanako”は、変数を取り出す際に使います。さきほど紹介した「配列」では、変数を取り出す際に$member[0]と順番を指定していましたが、連想配列は取り出す際に”tarou”や”hanako”と指定して取り出すことが出来ます。
新しく追加するには、
1 |
$japanese['kazuko'] = 80; |
とすると後ろに追加することが出来ます。取り出す際には、
1 |
$hanako_japanese = $japanese['hanako']; |
このように記述すると、$hanako_japaneseの中に70というデータを入れることが出来ます。
この連想配列も、配列と同じように順番で取り出すことが出来ます。今回の例でいうと、$japanese[0]と$japanese[“tarou”]は同じく90を取り出すことが可能です。
多次元配列は配列や連想配列の中にさらに配列や連想配列を入れることができる
1 2 3 4 5 6 7 8 9 10 |
$test_score = array( $member, $japanese, array( "tarou" => 80, "hanako" => 90, "kazuo" => 70, ), "webukatu highschool" ); |
多次元配列は今まで紹介した配列の項目が、更に配列になっているものです。さきほどの$member(配列)や$japanese(連想配列)を変数のまま入れたり、3番目のように連想配列をそのまま記述できたり、4番目の”webukatu highschool”のように普通にデータを入れることも可能です。
この場合の取り出し方は、例えば3つ目の要素の中の80を取り出したい場合、こうなります。
1 |
$test_score[1]["tarou"] |
ちょっとややこしいですが、この多次元配列は扱えると非常に便利です。
phpのfor文はループ処理を行うことができる
for文は、繰り返しの処理を行うことが出来ます。繰り返しの処理というのは、同じ動作を繰り返し実行することです。具体的に見ていきましょう。
1 2 3 |
for($i = 1; $i <= 10; $i++){ echo ”これは”.$i."回目のループです。<br>"; } |
これを実行すると、以下のようになります。
詳しく解説していきます。
for文には開始時に実行される式、条件式、1ループ終了ごとに実行される式がある
先程の例でいうと、一行目の
1 |
for($i = 1; $i <= 10; $i++) |
の$i = 1というのが開始時に実行される式です。開始時に実行される式は、for文を実行する際に一度だけ最初に実行されるものです。今回は、「$iという変数の中に1を入れる」というものです。
ちなみに、ループの回数を記録しておく変数を$iという変数名にしてありますが、ここはどんな名前でも良いです。しかし、ループの回数を記録しておく変数は慣用的に$iを使用しています。
条件式というのは、条件に合う場合再度処理を実行するというものです。今回であれば$i <= 10($iが10以下)です。
最後の$i++というのは1ループ終了ごとに実行される式であり、今回の$i++は$iに1を足すというもので、インクリメントという名前がついています。
今回のループを解説すると、
- はじめに$i=1が設定される。
- $iは1だから10以下であり、条件にあっているのでechoの部分が実行される。
- $iに1を足す。
- $iは2だから10以下であり、条件にあっているので……
2~3を続けていく。ループを繰り返し続けていき、$iが11になったとき条件に合わなくなりループが終了する。
という流れになっています。
phpの配列(array)をfor文で扱うメリット
記述を少なくできるので作業スピードが上がり、ミスが少なくなる
これは読んでそのままですね。配列の要素が多くなれば多くなるほど、スピードが違います。また、少ない記述はそれだけ記述ミスが起こりづらいです。phpは記述ミスのエラーで画面が表示されなくなることも多いです。ミスを起こしづらいというのはとても大きなメリットとなります。
可読性が高くなる
可読性、というのは一言で表すならば読みやすさです。100行の記述と10行の記述では10行の記述のほうが読みやすい、というのは直感的にわかりやすいと思いますが、その他にも何をやっているのかがわかりやすいというメリットがあります。
一人で開発を行う際はあまり気にならないかもしれませんが、複数のエンジニアが関わるチーム開発では、他の人が書いたコードを改善したり、流用したりすることが多く、その際に何をやっているのかが分かりづらいというのはそれだけで開発のスピードを下げてしまうので、この可読性というのは重要視されます。
後から変更しやすい
配列の中にデータがありますが、そのデータが追加されたり削除されたり、変更されると、その変更に伴ってその変数がかかわる処理も変更が必要になりますが、for文を使うことでその変更を最小限にすることが可能となります。
phpで配列(array)をfor文で扱う具体例1:配列の中のデータを表示しよう!
以下のデータが与えられたとします。
1 2 3 4 5 6 7 8 9 10 |
$member = array( "tarou", "hanako", "kazuo", "kazuko", "hiroki", "hiroko", "yuuki", "yuri" ); |
クラスメートの名前が入った配列ですね。これを以下のように表示したいです。
この場合、for文を使わないと、以下のようになります。
1 2 3 4 5 6 7 8 9 |
<h1>クラスメートの名前</h1> <h2><?php echo $member[0] ?></h2> <h2><?php echo $member[1] ?></h2> <h2><?php echo $member[2] ?></h2> <h2><?php echo $member[3] ?></h2> <h2><?php echo $member[4] ?></h2> <h2><?php echo $member[5] ?></h2> <h2><?php echo $member[6] ?></h2> <h2><?php echo $member[7] ?></h2> |
これがさらに40人に増えたりしたら、もっと大変になります。
for文を使うと、こうなります。
1 2 3 4 |
<h1>クラスメートの名前</h1> <?php for($i = 0,$member_num = count($member); $i < $member_num; $i++){ ?> <h2><?php echo $member[$i] ?></h2> <?php } ?> |
なんと半分以下の記述で済んでしまいました。しかも、人数が増えても書き換える必要がありません。詳しく見ていきます。
配列の中の要素の個数を知りたいときはcount()を使う
今回、いきなり出てきたcount()という関数ですが、引数に配列を渡してあげると、配列の要素の個数を数値として返してくれます。今回であれば、8人の名前、つまり8個の要素があるので8個ですね。なので$member_numに8という数値が入っています。
1 |
<h2><?php echo $member[$i] ?></h2> |
そして、実行される処理としては$member[$i]を表示するというものですが、この$iというのはfor文の()に入っていた$iです。ループの回数に応じて変化するため、配列の要素すべてを表示できます。そして、最後の要素を表示したとき、条件式に合わなくなりループが終了します。
これが、基本的なfor文の使い方です。
phpで配列(array)をfor文で扱う具体例2:期末テストの結果を表示しよう!
以下のデータが与えられたとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
$member = array( "tarou", "hanako", "kazuo", ); $japanese = array( "tarou" => 90, "hanako" => 70, "kazuo" => 50, ); $math = array( "tarou" => 80, "hanako" => 90, "kazuo" => 70, ); $english = array( "tarou" => 50, "hanako" => 70, "kazuo" => 90, ); $test_score = array( $japanese, $math, $english ); $subject_name = array("国語","数学","英語") |
tarou、hanako、kazuoという3人のクラスメートがいて、国語、数学、英語の期末テストがありました。そのテスト結果が教科ごとに与えられています。今回は、このデータを各個人ごとにまとめて表示したいとします。想定としてはこのようなものです。
もしfor文を使わない場合、一応面倒ですがギリギリかけると思います。が、これが40人になったり、科目が増えたりしたら非常に大変ですよね。
今回の場合、for文を使うと、もし科目が増えても、人が増えても書き換える事がありません。
以下、実際のfor文です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<h1>期末テストの結果発表!</h1> //このfor文は「tarouのテスト結果」などのテスト結果の部分ををループさせる <?php for($i = 0, $member_num = count($member); $i < $member_num; $i++){ ?> //1 <h2><?php echo $member[$i] ?>のテスト結果</h2> //このfor文で「国語:90」のように科目と点数をループさせる <?php for($j = 0, $subject_num = count($test_score); $j < $subject_num; $j++) {?> //2 <p><?php echo $subject_name[$j].":".$test_score[$j][$member[$i]]; ?></p> <?php } ?> <?php } ?> |
for文を入れ子構造にしてあります。
1 |
<?php for($i = 0, $member_num = count($member); $i < $member_num; $i++){ ?> //1 |
一番目に出てくるfor文です。具体例1でも出てきたcount()を使用しています。配列の中にある要素の個数を数値で返してくれる便利な関数でした。最初に実行される式でこの数値を変数に入れ、その変数と比較するという条件をつけています。
1 |
<?php for($j = 0, $subject_num = count($test_score); $j < $subject_num; $j++) {?> //2 |
二番目に出てくるfor文ですが、こちらも1番目と同じような処理です。
1 |
<p><?php echo $subject_name[$j].":".$test_score[$j][$member[$i]]; ?></p> |
二番目のfor文の中身ですが、ちょっとややこしいので解説します。
$subject_name[$j]は教科の名前を入れてある変数で、この変数の$j番目のデータを取り出しています。そして「.」で文字列をつなぎ、$test_score[$j][$member[$i]]を表示しています。この$test_scoreというのは、
1 2 3 4 5 |
$test_score = array( $japanese, $math, $english ); |
ですね。そして、$japaneseも、
1 2 3 4 5 |
$japanese = array( "tarou" => 90, "hanako" => 70, "kazuo" => 50, ); |
となっています。これは多次元配列となっています。
この場合、$test_scoreの中にある$japaneseの90という数値を取り出したい場合、
1 |
$test_score[0]["tarou"] |
という取り出し方をします。実は先程の$test_score[$j][$member[$i]]もこれと同じことをしています。
流れとしては、
- 外側のループに入る。
- 「tarouのテスト結果」という文を表示させる。
- 内側のループに入る。
- $subject_nameの1つ目の「国語」、$test_scoreの$japaneseの中の”tarou”の値を取り出し、表示させる。
- 条件に合わなくなるまでループを行う。 (3.1に戻る)
- 3回繰り返すと条件に合わなくなり、内側のループを抜ける。
- 条件に合わなくなるまでループを行う。(2に戻る)
- 3回繰り返すと条件に合わなくなり、外側のループを抜ける。
ということが行われています。
このように、多次元配列を用いて、要素の個数に合わせて内側と外側をループさせることで、今回のような複雑なループを実現させています。
まとめ
いかがでしたか?今回は、
- phpの変数の配列について
- phpの配列の扱い方
- phpの配列を使った「繰り返し(ループ)文」であるfor文の扱い方
を紹介しました。
多次元配列やfor文は一番最初は非常にわかりづらく、「どこで使うの?」と、用途もわからないようなものですが、for文は使いこなすことができれば非常に便利なものです。ぜひ使ってみてくださいね。