10週間ウェブ開発講座

第三週

配列

phpでは、配列と呼ばれる特殊な変数を扱うことができます。
配列は、複数の値を格納することができる変数です。

配列は、array() という記号を使うことで初期化することができます。
また、配列である変数に、

変数名[数字]

と書くことで、値を取り出すことができます。この表現において[数字]の部分を"配列の添字"と呼びます。

  1. <?php
  2.  
  3. $hairetsu = array("s-tanno", "y-geshi", "y-mahata");
  4.  
  5. echo $hairetsu[0]; // "s-tanno"
  6. echo $hairetsu[1]; // "y-geshi"
  7. echo $hairetsu[2]; // "y-mahata"
  8.  
  9. ?>

なお、プログラム中で"//"の後に来る部分はプログラムとして機能しません*1

また、配列の中身を書き換えることも可能です。

  1. <?php
  2.  
  3. $hairetsu = array("s-tanno", "y-geshi", "y-mahata");
  4. $hairetsu[2] = "usapon"; // => 配列の中身が書き換わった。
  5.  
  6. echo $hairetsu[0]; // "s-tanno"
  7. echo $hairetsu[1]; // "y-geshi"
  8. echo $hairetsu[2]; // "usapon"
  9.  
  10. ?>

一歩進んだ配列の使い方に、「連想配列」というものがあります。
連想配列は、文字列と値を関連付けた配列です。例を見てみましょう。

  1. <?php
  2.  
  3. $hairetsu = array("apple" => "りんご", "grape" => "グレープ", "strawberry" => "いちご");
  4.  
  5. echo $hairetsu["apple"]; // "りんご"
  6. echo $hairetsu["grape"]; // "グレープ"
  7. echo $hairetsu["strawberry"]; // "いちご"
  8.  
  9. ?>

これまでは、配列の添字に数字を使っていましたが、配列の添字として文字列を使えるということを覚えておいてください。
また、配列の添字が文字列である場合、添字を"キー"と呼ぶことがあります。

ループ

プログラムを書いていると、同じような処理を繰り返し実行したくなる場合があります。
そのような場合に役に立つのが"ループ"と呼ばれる機能です。

phpでループを扱う方法は幾つか存在しますが、その内、ポピュラーなものを幾つか見ていきましょう。

forについて

例えば、次のような出力をするphpプログラムを考えましょう。

  1. <?php
  2.  
  3. echo " 1<br />\n";
  4. echo " 2<br />\n";
  5. echo " 3<br />\n";
  6. echo " 4<br />\n";
  7. echo " 5<br />\n";
  8.  
  9. ?>

これは、1から5までの数を単純に出力しているだけなので、ループを使うと短く書くことができます。

ここで、forを使ってループを作成するサンプルを見てみましょう。

  1. <?php
  2.  
  3. for ($i = 1; $i <= 5; $i++) {
  4.   echo "$i<br />\n";
  5. }
  6.  
  7. ?>

上記のプログラムで、先ほどと同様の出力を得られます。
forは、大きく4つの部分から成り立ちます。

for(第一部分; 第二部分; 第三部分) {
  第四部分(=本体)
}
  • 第一部分:データの初期化のためのプログラムを記述します
  • 第二部分:ループを継続するための条件を記述します
  • 第三部分:各ループ終了時の動作を記述します
  • 第四部分:各ループでの処理を記述します

先ほどのプログラムでのforでは、次のようなことを実行しています。

  1. 変数$iに1を代入
  2. ループ本体を実行
  3. $i++ を実行
  4. $i <= 5 を確認(=>正しければ 1. に戻る)

以上がforの挙動です。「$i++」はインクリメント演算と呼ばれるもので、「$i = $i + 1」と同様の効果があります。

whileについて

forと同様のループを、whileという機能を使っても実現できます。
先ほどforで記述したものと同等のことをwhileを使えば次のように書くことができます。

  1. <?php
  2.  
  3. $i = 1;
  4. while ($i <= 5) {
  5.   echo "$i<br />\n";
  6.   $i++;
  7. }
  8.  
  9. ?>

一見すると、forよりも動作が複雑であるように見えます。
しかし、forで「;」によってわけられた作業を一行ずつ丁寧に書いていると解釈することも可能です。

whileを使うときには、 「while (条件) {処理}」のように記述します。
条件が成立する間は処理を繰り返し実行します。

foreachについて

foreachは配列の要素を走査するための機能です。
例を見てみましょう。

  1. <?php
  2.  
  3. $hairetsu = array("s-tanno", "y-geshi", "y-mahata");
  4.  
  5. foreach ($hairetsu as $user_id) {
  6.   echo $user_id;
  7. }
  8.  
  9. ?>

このプログラムを実行してみてください。
"s-tanno"、"y-geshi"、"y-mahata"が順番に表示されたはずです。

foreachは、「foreach(配列 as 変数) {処理}」と書きます。
{処理}の中では、配列の一要素を持つ変数を使用することができます。
さきほどの例では、その変数は「$user_id」という名前でした。

条件分岐

phpは条件に応じて処理の流れを変更する機能を備えています。
「条件に応じて処理の流れを変更」することを「条件分岐」と呼びます。
phpでは条件分岐のために、「if」と「switch ~ case ~」という二つの方法がありますが、
ここではifのみ紹介します。

ifについて

ifの例を見てみましょう。

  1. <?php
  2.  
  3. $ten = 10;
  4.  
  5. if (0 > $ten) {
  6.   echo "$ten は0より小さいです。\n";
  7. }
  8.  
  9. if (0 <= $ten) {
  10.   echo "$ten は0以上です。\n";
  11. }
  12.  
  13. ?>

このプログラムを実行してみてください。
ifの動作を推測することができると思います。

ifは「if (条件) {処理}」というように記述します。
条件が正しいときにのみ、{処理}が行われます。
条件の記述には比較演算子が使われます。さきほどのプログラムでの「>」「<」が比較演算子に該当します。
phpで使用される主な比較演算子は次の通りです*2

(A === B) => A と B が等しいときに真
(A < B) => A が B より小さいときに真
(A > B) => A が B より大きいときに真
(A <= B) => A が B より小さいか等しいときに真
(A >= B) => A が B より大きいか等しいときに真

ここまでが直感的な説明になります。
本来は「等しい」とは何か、また「小さい」や「大きい」とは何かの議論が必要なのですが、ここではその議論は置いておくとします。
詳細な説明は、phpのマニュアルを参照してください。

また、ifにelseというものを併せることで、さきほどのプログラムをより簡潔に書くことができます。

  1. <?php
  2.  
  3. $ten = 10;
  4.  
  5. if (0 > $ten) {
  6.   echo "$ten は0より小さいです。\n";
  7. } else {
  8.   echo "$ten は0以上です。\n";
  9. }
  10.  
  11. ?>

ifとelseを使うときの記述は「if (条件) {処理A} else {処理B}」になります。
これは、(条件) が成り立つ(=真である)ときに{処理A}を実行し、(条件)が成り立たない(=偽である)ときに{処理B}を実行します。

インデントについて

ループや条件分岐では「ループで処理する範囲」や「条件によっては処理する範囲」は"{}"で括られることを見てきました。
この"{}"で括られた範囲は、数文字分の字下げが行われるべきです。
プログラム中で特定の(数)行を字下げすることをインデントと呼びます。

インデントによりプログラムの可読性を向上させることができます。
次の二つのプログラムは等価ですが、後者の方が読み易いはずです。

  1. <?php
  2. $year = 2009;
  3. if (0 === ($year % 400)) {
  4. echo "{$year}はうるう年。\n";
  5. } else {
  6. if (0 === ($year % 100)) {
  7. echo "{$year}はうるう年でない。";
  8. } else {
  9. if (0 === ($year % 4)) {
  10. echo "{$year}はうるう年。\n";
  11. } else {
  12. echo "{$year}はうるう年でない。";
  13. }
  14. }
  15. }
  16. ?>
  1. <?php
  2. $year = 2009;
  3. if (0 === ($year % 400)) {
  4.   echo "{$year}はうるう年。\n";
  5. } else {
  6.   if (0 === ($year % 100)) {
  7.     echo "{$year}はうるう年でない。";
  8.   } else {
  9.     if (0 === ($year % 4)) {
  10.       echo "{$year}はうるう年。\n";
  11.     } else {
  12.       echo "{$year}はうるう年でない。";
  13.     }
  14.   }
  15. }
  16. ?>

宿題

今週は二つの宿題があります。

  • forを使い、九九の表を出力するプログラムを書いてください。
  • whileを使い、九九の表を出力するプログラムを書いてください。

作成したプログラムは、3rd_week_homework.htmlという名前で保存し、
http://y-mahata.s-tanno.com/3rd_week_homework.html で参照できるようにしてください。

出力は次のようになるはずです。

1 2 3 4 5 6 7 8 9<br />
2 4 6 8 10 12 14 16 18<br />
3 6 9 12 15 18 21 24 27<br />
4 8 12 16 20 24 28 32 36<br />
5 10 15 20 25 30 35 40 45<br />
6 12 18 24 30 36 42 48 54<br />
7 14 21 28 35 42 49 56 63<br />
8 16 24 32 40 48 56 64 72<br />
9 18 27 36 45 54 63 72 81<br />

ヒントは「ループのネスト」です*3


*1 一般に「コメントアウトする」と表現されます。
*2 本当はもっとたくさんありますが、この講座で必要なものに限定しています。
*3 forの中でforを使うことや、whileの中でwhileを使うことを「ループをネストする」と表現します。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-07-30 (金) 14:15:31 (37d)