このレッスンはただ今 無料公開中 です。

初学者向け マンツーマン プログラミング・レッスン

PHPの繰返し処理

前章で学んだ分岐処理に続いて、もうひとつの制御構文である「繰返し処理」について本章で学んでいきます。

繰返し処理は、ある条件を満たすまでの間ずっと同じ箇所の処理を繰り返し実行します。ループ処理とも呼ばれます。

PHPの繰返し処理には次の種類があります。

  • for文
  • foreach文
  • while文
  • do〜while文

習うより慣れろで、さっそくコードを書いていきましょう。まずはfor文のサンプルコードです。

for文

repeat.php
<?php
$sum = 0;

for($i=1;$i<=10;$i++) {
  $sum += $i;
  print $i . PHP_EOL;
}

print '合計は ' . $sum. PHP_EOL;

実行結果

1
2
3
4
5
6
7
8
9
10
合計は 55

構文を詳しくみていきましょう。

for (初期処理; 条件式; 後処理) {
  // 条件を満たす間は繰返しここの処理を実行する
}

初期処理

このプログラムがfor文を実行しようとすると、最初に「初期処理」を行います。この場合は

$i = 1

$iという変数を宣言して、1という数値を代入しています。ちなみにfor文では慣習的に $i という変数名が使われることが多いですが、名前は別になんでも構いません。ちなみにこの変数のことを便宜上「カウンタ変数」と呼ぶこともあります。

条件式

さて次に

$i <= 10

という条件式を評価します。$i には 1 が代入されているので、10以下かどうかという条件は満たします。つまり true ですね。
trueならば {} ブロックの中の処理を実行します。

$sum += $i;

演算子の章で出てきましたが、 + という算術演算子と = という代入演算子が組み合わさっています。これを別の書き方にしてみると

$sum = $sum + $i;

自分自身に何かを加算する場合は、 += で加算と代入を同時に行うことができます。
$sumは最初に 0 が代入されていましたが、この時点で $i の値である 1 が加算されました。$sumの値は現在 1 です。

次の行では、実行結果をわかりやすくする目的で $i の値を出力しています。

print $i . PHP_EOL;

これでブロック内の処理は終了ですが、条件式をまだ満たしていないので、今度は「後処理」に移ります。

後処理

$i++

++は「加算子」または「インクリメント」と呼ばれ、数値を1づつ増やします。

$i = $i + 1

これと同じことになります。

加算子によって $i はこの時点で 1 から 2 に変化しました。そして再び条件式の評価を受けます。2は10以下なので、まだループ処理から抜け出すことは出来ません。

$sum は 2 が加算されて 3 になります。
$iの値である 2 が print で出力されます。

そしてまた「後処理」に戻って条件式の評価を受けます。 この繰り返しによって最終的に $i が 11 になったら、ようやくループを抜け出すことができます。

$i は 1 から始まって 10 になるまでの間、1 が加算されます。 その間の10回の繰り返しによって、 $sum はその時の $i の値である 1〜10 の数値が順番に加算されていきます。その結果、

1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55

この足し算と同じことが行われたのでした。

練習問題1

repeat.phpのfor文の「条件式」の部分を次のように変えてみましょう。

$i<=20

繰り返し処理が20回行われ、1 から 20 までの足し算がされたことを確認して下さい。

練習問題2

無限ループを起こしてみましょう。

この練習問題2のコードは繰り返し処理を永遠に抜けられない状況を意図的に起こしています。
無限ループが起きてしまったら、慌てずにターミナルで「Ctrl + C」を押して止めて下さい。

これを1度体験しておきましょう。repeat.phpの「後処理」部分を加算子から減算子に変更します。

$i--

$iは 1 からスタートして 1 づつ減算されるので、条件式の $i<=10 はいつまでも満たされてしまいます。従って、ループ処理が止まらなくなってしまうのです。

練習問題3

$numberという変数が30から始まって0になるまでの間、$numberの値を出力するfor文を完成させて下さい。尚、繰返し処理ごとに$numberが1づつ減算するように、後処理には減算子 --(デクリメント)を使って下さい。

decrement.php
<?php
for (初期処理;条件式;後処理) {
  print $number. PHP_EOL;
}

練習問題4

前章「分岐処理」の練習問題でもやったFizzBuzzゲームに、for文を組み合わせてみましょう。
前章では $number という変数に値をあらかじめセットしておき、その値をif文で評価していました。今回は $number に1〜30の値が順番に入るような繰返し処理を実装してみましょう

fizzbuzz_for.php
<?php
  for(初期処理;条件式;後処理) {
    // この中で倍数をチェックして分岐処理
  }

ファイル名 fizzbuzz_for.php を新たに作成し、次の要件を満たすようにfor文を使って書いて下さい。

  • カウンタ変数$numberが 1 からはじまって 30 になるまで処理を繰り返す
  • 繰返し処理のたびに $number の値と改行(PHP_EOL)を出力する
  • ただし$numberが3の倍数の時は、$numberの代わりに Fizz を出力する
  • 同様に 5 の倍数の時は Buzzを、15の倍数の時は FizzBuzzを、それぞれ出力する

出力結果

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz

foreach文

foreach文もfor文と同じ繰り返し処理の制御構文です。for文が「初期処理」「条件式」「後処理」を決めてループを起こしていたのに対し、foreach文は「配列」を使ってループ処理を行います。

配列とは例えば

$data = [1, 2, 3, 4, 5];

のように、1つの変数に複数の値(要素)がまとめられているものでしたよね。foreach文は配列に含まれる要素の数の分だけ、繰り返し処理を行います。また、その中で1件づつの要素を取り出して処理をすることができます。もちろん、連想配列にも対応していて、1件づつのデータの要素(キーと値)にアクセスすることが可能です。

foreach文を使ったサンプルコードを書いてみましょう。

foreach.php

<?php
  $data = [
    'apple' => 'りんご',
    'banana' => 'バナナ',
    'orange' => 'オレンジ',
    'grape' => 'ぶどう'
  ];

  foreach ($data as $key => $value) {
    print $key. 'は'. $value. 'です。'. PHP_EOL;
  }

実行結果

appleはりんごです。
bananaはバナナです。
orangeはオレンジです。
grapeはぶどうです。

foreachの基本形は次の通りです

foreach (配列 as キーの変数 => 値の変数) {
  キーや値を使った処理
}

キーの変数と値の変数は好きな名前をつけて構いません。

配列を用いるという特徴から、for文のようにミスによって無限ループが起きるようなこともありません。また、配列の中身(キーと値)にアクセスするという特徴から、用途が明確にわかりやすいです。例えば、たくさんのブログの記事を一覧表示させたい場合などでは、foreach文の相性は抜群と言えるでしょう。

Webアプリケーションは突き詰めて言えば「一覧ページ」と「詳細ページ」で成り立っています。

世の中のWebアプリケーションの多くはそのような構成になっています。まず一覧ページがあって、その一覧には詳細ページへのリンクが貼ってあり、それをクリックすると詳細ページへ移動する、というイメージです。ブログやECサイトはまさにそのような構成になっているのではないでしょうか。

練習問題5

ある書籍のデータが配列に格納されています。

題名 著者 発行日
吾輩は猫である 夏目漱石 1905年10月
坊っちゃん 夏目漱石 1906年4月
羅生門 芥川龍之介 1915年11月
暗夜行路 志賀直哉 1922年1月

これを次のように出力されるように、foreach文の TODO: の部分を完成させなさい。

吾輩は猫である:夏目漱石:1905年10月
坊っちゃん:夏目漱石:1906年4月
羅生門:芥川龍之介:1915年11月
暗夜行路:志賀直哉:1922年1月
books.php
<?php
  $books = [
    ['title' => '吾輩は猫である', 'author' => '夏目漱石', 'release' => '1905年10月'],
    ['title' => '坊っちゃん', 'author' => '夏目漱石', 'release' => '1906年4月'],
    ['title' => '羅生門', 'author' => '芥川龍之介', 'release' => '1915年11月'],
    ['title' => '暗夜行路', 'author' => '志賀直哉', 'release' => '1922年1月'],
  ];

  foreach ($books as $book) {
    print // TODO:書籍データの中身の情報を出力
    print PHP_EOL;
  }

ヒント:連想配列の値の取り出し方については、chapger-4「PHP配列」の章の「連想配列」のセクションを参考にしましょう。

while文とdo〜while文

while文およびdo〜while文については、本コースでは詳しく扱いません。簡単なサンプルコードのご紹介にとどめます。詳しい書き方・使い方を知りたい方は、インターネットで検索しましょう。

php while php do while

while.php
<?php
  $x = 1;
  while ($x <= 10) {
    print $x. PHP_EOL;
    $x++;
  }
dowhile.php
<?php
  $x = 1;
  do {
    print $x. PHP_EOL;
    $x++;
  } while ($x <= 10);