Chapter05 反復

概要と目標 プログラム効率よく書くための、
反復を理解しよう。

同じ処理を何度も行う場合には、反復という繰り返し構文が便利です。
反復を活用して日付を選択できるセレクトボックスを、効率よく出力できるようになろう。

今回のゴール

RERUN

反復とは 同じ処理を繰り返す。

条件に一致している間や、特定の回数同じ処理を繰り返す制御構文。
反復には、 whilefor 文などがある。

反復は条件式がtrueの間処理を繰り返す。

while文 条件に一致する間
同じ処理を繰り返す。

while文は、条件式が true の間、同じ処理を繰り返す制御構文。

while文
while (条件式) {
  // 条件式が true の間繰り返す処理
}

while文を使ってみよう。

  1. 「chapter05」 › 「while」フォルダ内の「index.php」をテキストエディタで開く
  2. <?php?> の間に10回繰り返す while文を作成
chapter05/while/index.php
$i = 1; // ループ用変数の初期値
while ( $i <= 10 ) {
  // $i が 10 以下の間繰り返す
  echo $i. '回目のループ<br>';
  $i = $i + 1; // ループ用変数の加算
}
  1. 上書き保存
  2. ブラウザで「chapter05」 › 「while」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter05/while/
ブラウザでの表示例

RERUN

インクリメントを活用して
コードを短くしてみよう。

インクリメントとは、++ という演算子の事で、
変数名の後ろに記述すれば、自分自身(変数)に「1」を加算する という処理になる。
従って、上記コード内にある $i = $i + 1; は、インクリメントを使うことで、短く記述することができる。

  1. 「chapter05」 › 「while」フォルダ内の「index.php」をテキストエディタで開く
  2. 下記を参考に $i = $i + 1;$i++;に変更する
chapter05/while/index.php
$i = 1; // ループ用変数の初期値
while ( $i <= 10 ) {
  // $i が 10 以下の間繰り返す
  echo $i. '回目のループ<br>';
  $i++; // ループ用変数の加算(++: インクリメント。自分自身に 1 を足す)
}
  1. 上書き保存
  2. ブラウザで「chapter05」 › 「while」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter05/while/
ブラウザでの表示例

RERUN

比較演算子 比較演算子を使って
条件式を作る。

2つの値を比較する時に用いる演算子を、比較演算子と呼ぶ。
while文や、後で紹介するfor文の条件式は、
いつまで反復するのかを、比較演算子を用いて作る。

主な比較演算子
説明
A > B A が B より大きい間繰り返す
A < B A が B より小さい間繰り返す
A >= B A が B 以上の間繰り返す
A <= B A が B 以下の間繰り返す
A == B A が B と等しい時だけ繰り返す
A != B A が B と異なる時だけ繰り返す

while文の注意点 いつか必ず終わること。

while文は必ず終了するように作る。
以下の3つの何れかにミスがあると 無限ループとなり、プログラムが終了しない。

$i = 0;  ← ループ用変数の初期値
while ( $i < 10) {  ← ループの継続条件
  echo 'Looping...' . $i;
  $i++;  ← ループ用変数の増減
}

反復は、いつか条件が false になるように作る。

for文 指定した回数
同じ処理を繰り返す。

ループ用変数の初期値ループの継続条件ループ用変数の増減
1行で記述することができる反復。

for文
for (ループ用変数の初期値; ループ継続条件; ループ用変数の増減) {
  // 条件式が true の間繰り返す処理
}

for文を使ってみよう。

  1. 「chapter05」 › 「for」フォルダ内の「index.php」をテキストエディタで開く
  2. <?php?> の間に10回繰り返す for文を作成
chapter05/for/index.php
for ( $i = 1; $i <= 10; $i++ ) {
  // $i が 10 以下の間繰り返す
  echo $i .'回目のループ<br>';
}
  1. 上書き保存
  2. ブラウザで「chapter05」 › 「for」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter05/for/
ブラウザでの表示例

RERUN

while文 と for文 の使い分け
基本的にはどちらを使っても問題はないため、明確な使い分けはない
ただし、一般的に下記のように使わけているプログラマーが多い。
  • 繰り返す回数が決まっていない場合 ・・・ while文
  • 繰り返す回数が決まっている場合 ・・・ for文

セレクトボックスの生成 セレクトボックスは反復を使って
効率よく生成できる。

年齢を選択するセレクトボックスや、日付を選択するセレクトボックスは、反復を活用することで、効率よく生成できる。

年齢を選択するセレクトボックスを
作ってみよう。

  1. 「chapter05」 › 「select」フォルダ内の「index.php」をテキストエディタで開く
  2. <dd></dd> の間にfor文を活用した 年齢を選択するセレクトボックスを作成
chapter05/select/index.php
<select id="age" name="age">
<?php
  for ( $i = 10; $i <= 70; $i++) {
    echo '<option value="'. $i .'歳">'. $i .'歳</option>';
  }
?>
</select>
  1. 上書き保存
  2. ブラウザで「chapter05」 › 「select」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter05/select/
ブラウザでの表示例

RERUN

日時の取得 date関数を用いれば、
現在の日時が取得できる。

PHPで現在の日時を取得するには、date関数を使う。
date関数は、引数に取得したい項目のフォーマットを指定することで、様々な値を取得できる。

date関数
date(フォーマット);

戻り値: 取得項目をフォーマットに当てはめた文字列

引数はPHPマニュアルを参照

主なフォーマット
フォーマット 説明
Y 4桁の年。Ex: 2016
y 2桁の年。Ex: 16
m ゼロ詰めの月。01 ~ 12
n ゼロなしの月。1 ~ 12
F フルスペルの月。Ex: January
M 3文字形式の月。Ex: Jan
d ゼロ詰めの日。01 ~ 31
j ゼロなしの日。1 ~ 31
z 年間の通算日。0 ~ 365
t 月の日数。28 ~ 31
g 12時間単位の時(ゼロなし)1 ~ 12
G 24時間単位の時(ゼロなし)0 ~ 23
h 12時間単位の時。01 ~ 12
H 24時間単位の時。00 ~ 23
i ゼロ詰めの分。00 ~ 59
s ゼロ詰めの秒。00 ~ 59
曜日 l フルスペルの曜日。Ex: Monday
D 3文字形式の曜日。Ex: Mon
w 数値の曜日。0(日) ~ 6(土)

date関数を使ってみよう。

  1. 「chapter05」 › 「date」フォルダ内の「index.php」をテキストエディタで開く
  2. h1要素の下にdate()関数を使って現在の日時を出力
chapter05/date/index.php
<p>現在は、<?php echo date('Y年 m月 d日 H:i:s'); ?>です</p>
  1. 上書き保存
  2. ブラウザで「chapter05」 › 「date」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter05/date/
  3. 時間がずれていることを確認。
    環境によってデフォルトのタイムゾーンの設定が異なる。
ブラウザでの表示例

RERUN

タイムゾーンを変更してみよう。

date_default_timezone_set関数
date_default_timezone_set(タイムゾーン);

戻り値: タイムゾーンが無効 ・・・ false  それ以外なら ・・・ true

引数はPHPマニュアルを参照

  1. 「chapter05」 › 「date」フォルダ内の「index.php」をテキストエディタで開く
  2. ファイルの冒頭で、date_default_timezone_set()関数を使い、タイムゾーンを東京に変更
chapter05/date/index.php
<?php
  // タイムゾーンの設定(東京)
  date_default_timezone_set('Asia/Tokyo');
?>
  1. 上書き保存
  2. ブラウザで「chapter05」 › 「date」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter05/date/
  3. 時間が東京時間になっていることを確認。
ブラウザでの表示例

RERUN

練習問題 今回の理解度をチェック。

完成例を参考に「tranig」フォルダ内の「index.php」と「receive.php」を完成させて下さい。

ブラウザでの表示例

RERUN

「index.php」の問題

    • フォーマット: "【現在の年】年 【現在の月】月の予約フォーム"
    • 送信先: "receive.php"
    • 送信方法: "post"
    • ラベル: "希望日"
    • セレクトボックス: 現在の月の日付

「receive.php」の問題

    • フォーマット: "【現在の年】年 【現在の月】月 【ユーザーが選択した日】日"
解答例
chapter05/training/index.php
<?php
  date_default_timezone_set('Asia/Tokyo');
?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>練習問題5</title>
</head>
<body>
  <h1><?php echo date('Y年 n月'); ?>の予約フォーム</h1>

  <form action="receive.php" method="post">
    <dl>
      <dt><label for="date">希望日</label></dt>
      <dd>
        <?php echo date('Y年 n月'); ?>
        <select id="date" name="date">
        <?php
          for ($i = 1; $i <= date('t'); $i++) {
            echo '<option value="'. $i .'">'. $i .'日</option>';
          }
        ?>
        </select>
      </dd>
    </dl>
    <p><input type="submit" value="送信"></p>
  </form>
</body>
</html>
chapter05/training/receive.php
<?php
  date_default_timezone_set('Asia/Tokyo');
?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>練習問題5</title>
</head>
<body>
  <h1>入力確認</h1>

  <dl>
    <dt>希望日</dt>
    <dd>
      <?php echo date('Y年 n月'); ?>
      <?php echo htmlspecialchars($_POST['date'], ENT_QUOTES, 'utf-8'); ?>日
    </dd>
  </dl>
  <p><a href="./">予約フォームに戻る</a></p>
</body>
</html>

解答例は全問題のチェックボックスが on になるとご覧いただけます。

まとめ 何度も同じ処理を行う時は、
反復を活用する、。

while文 や for文 は繰り返し処理を行う制御構文です。
セレクトボックスるの生成など、何度も同じ処理を行う時に活用します。

  • 反復は何度も同じ処理を行う制御構文。
  • 繰り返す回数が決まっていない時は、主にwhile文を使う。
  • 繰り返す回数が決まってる時は、主にfor文を使う。
  • 日付はdate関数で取得できる。