こんにちは、CTOの奥田です。
先日娘が熱を出し病院に連れて行くと急遽入院することになり慌てふためきました。
幸い3日で退院できましたが小さい体に注射や点滴を打たれて泣いている姿には心を痛めました。
我が子を心配する親の気持ちが少しわかったような気がします。
さて、今回のPHP入門はループ処理についてです。
前回は「条件分岐」についてご説明しましたが、今回のループ処理を組み合わせてさらに複雑な処理を書くことができます。
Table of contents
ループ処理とは
ループ処理とは処理をn回繰り返す際や、配列の値を1つずつ検証し、なにか処理をしたいときなどに用いられます。
ループ処理を有効活用することにより、よりシンプルなコードで素早く作業を行うことができます。
for文
多くの言語でも使え、最もポピュラーと言えるループ処理がfor文です。
for文の書き方は以下です。
for (式1; 式2; 式3){ 処理 }
式1はループ開始時に無条件に評価(実行)されます。
各繰り返しの開始時に、式2が評価されます。その式の値がTRUEの場合、ループは継続されブロック内の処理が実行されます。値がFALSEの場合、ループの実行は終了します。
各繰り返しの後、式3が評価(実行)されます。
1から10回繰り返し、出力した例が以下です。
for ($i = 1; $i <= 10; $i++) { echo $i; }
配列をループさせたい場合は以下のようにします。
count()で配列の最大値を取得し、$iが配列の最大値に達するまで繰り返します。
$fruits = ["apple","grape","pine"]; for ($i = 0; $i < count($fruits); $i++) { echo $fruits[$i]; }
while文
while文は条件式がtureの場合実行を続けます。
最もシンプルにかけますが無限ループに陥りやすい書き方ですので注意が必要です。
while (条件式){ 処理 }
1から10回繰り返し、出力した例が以下です。
$i = 1; while ($i <= 10) { echo $i; $i++; // $iに1を足す }
do-while文
while文にはdo-while文というものがあります。
doで書かれた処理を始めに実行する以外はwhile文と違いはありません。
$i = 0; do { echo "ループを開始します。"; } while ($i <= 10) { echo $i; $i++; // $iに1を足す }
foreach文
foreachは配列をループ処理するための便利な方法です。
foreachが使えるのは配列とオブジェクトだけであり、別のデータ型や初期化前の変数に対して使うとエラーになります。
foreach (配列 as $value){ 処理 }
1から10回繰り返し、出力した例が以下です。
$arr = range(1, 10); foreach ($arr as $value) { echo $value; }
$key => $valueの指定をすることで現在のキーを$keyで取得できます。
foreach (配列 as $key => $value){ 処理 }
$fruits = ["apple","grape","pine"]; foreach ($fruits as $key => $value) { echo $key ." : ". $value. ", "; } // 結果 // 0 : apple, 1 : grape, 2 : pine,
ループのネスト
ループはネスト(入れ子)することができます。
これは余談ですがfor文でインデックスに用いるi,j,kなどはFORTRANというプログラミング言語が起源とされているそうです。
for ($i = 1; $i <= 3; $i++) { for ($j = 1; $j <= 10; $j++) { echo $j; // 1から10を3回出力 } }
whileやforeachでもネストできます。
foreachの場合、変数名を変えることに注意してください。
$arr1 = range(1, 3); $arr2 = range(1, 10); foreach ($arr1 as $arr1_key => $arr1_value) { foreach ($arr2 as $arr2_key => $arr2_value) { echo arr2_value; } }
ループをスキップ・終了する
ループ処理をスキップしたい場合はcontinueを使います。
continueはそこで現在のループ処理をスキップし、次のループへ移動します。
for ($i = 1; $i <= 10; $i++) { if ($i % 2 == 0) { // $iが偶数の処理をスキップします continue; } echo $i; }
continueは引数を指定でき、ネストしたループ構造を抜ける数を指定することができます。
この引数のデフォルトは1で、直近のループ構造のみスキップします。
for ($i = 1; $i <= 3; $i++) { for ($j = 1; $j <= 10; $j++) { if ($j % 2 == 0) { continue 1; } echo $j; } }
ループ処理をそこで終わらせたい場合はbreakを使用します。
for ($i = 1; $i <= 10; $i++) { if ($i > 3) { // $iが4以上の場合処理を終了します break; } echo $i; }
continue同様引数を指定でき、ネストしたループ構造を抜ける数を指定することができます。
この引数のデフォルトは1で、直近のループ構造からのみ抜けます。
for ($i = 1; $i <= 3; $i++) { for ($j = 1; $j <= 10; $j++) { if ($j > 3) { break 1; } echo $j; } }
さいごに
私がプログラミングを勉強しだした頃に初めて思い通りにループ処理を書けた時は嬉しさもひとしおでした。
自動的に何かをするというループ処理はよりプログラミングしていると実感できるのかもしれません。
少しでもみなさんの参考になれば幸いです。