【PHP第3回】制御構造(条件分岐・ループ処理)

【PHP第3回】制御構造(条件分岐・ループ処理)

PHPのプログラミングメモ第3回です。

【コードの格納先】
>> github.com/conti0513


【関連記事】


条件分岐

if文

  • 1 もし・・・の場合、〜する if
  • 2 もし・・・の場合、〜する。そうじゃない場合、〇〇〇する。if else
  • 3 もし・・・の場合、〜する。そうでなくて、もし△△△の場合、〇〇〇する if elseif
構文
// if文の書き方
//
// if (条件1) {
//     条件1がtrueの時の処理
// } else if (条件2){
//     条件2がtrueの時の処理
// } else {
//     それ以外の場合の時の処理
//}
// 条件の書き方の例
// $a < $b --- $a が $b より小さければtrue
// $a <= $b --- $a が $b 以下ならばtrue
// $a > $b --- $a が $b より大きければtrue
// $a >= $b --- $a が $b 以上ならばtrue
// $a == $b --- $a と $b が等しければtrue (値を比較)
// $a === $b --- $a が $b が等しければtrue (値と型を比較) // データ比較を行う場合はこちらを利用するのがベター
// !$a --- $aでなければtrue

// sample code 1
$age = 60;
if ($age < 20) {
    echo "未成年です。";
} else if ($age >= 60) {
    echo "シニアです。";

} else {
    echo"成年です。";
}

// result
シニアです。

注意点 インデントは揃えること

  • ブロックの始まり、終わりは同じインデントにする
  • ブロック内では必ずインデントをつける

ダメな例

if (////) {
$name = 'kato'; // ブロック内でインデントがついていない
}

function getUser() {
    //
    }           // ブロックの始まり、終わりが同じインデントになっていない      

良い例

if (////) {
    $name = 'kato';  // ブロック内でインデントがついている
}                    // ブロックの始まりと終わりが同じインデントになっている 

function getUser() {
    //
}

// sample code 2
// 整数型の2つの変数(num1, num2)を宣言
// num1 - num2 が偶数、奇数、0で「even number」「odd number」「0」と表示させるような条件式を書く

$num1 = 15;
$num2 = 15;

// 計算結果を$diffに代入
$diff = $num1 - $num2;

// 条件式は上から実行されるので、「0」のパターンを先に書く
if ($diff === 0) {
    echo "0".PHP_EOL;
} elseif ($diff % 2 === 1) {
    echo "odd number".PHP_EOL;
} elseif ($diff % 2 === 0) {
    echo "even number".PHP_EOL;
}

// result
0

三項演算子

// 三項演算子
// if文と似ているが、三項演算子は演算子の1つなので結果として式を返す
// if文のように条件に応じた処理を記述するものではない点に注意

// 条件 ? 条件がtrueの時の処理 : 条件のがfalseの時の処理

// sample code 1
$age = 19;
echo $age < 20 ? "未成年です" : "成年です"; // 可読性を上げるために"?"の前後に半角スペースを入れること

// result
未成年です

// sample code 2

$int_num1 = 49;
$int_num2 = 1;

$str_reslt = (($int_num1 + $int_num2) < 50 ) ? '50未満' : '50以上'; // 可読性を上げるために"?"の前後に半角スペースを入れること

echo $str_reslt;
echo PHP_EOL;

// result
50以上



■イコールの数による違い
// sample code
// ===を使った場合
// int型
$value1 = 1;

// str型
$value2 = "1";

//型の比較を行う
if ($value1 === $value2){
    echo "同じです";
} else {
    echo "違います";
}

// result
違います

switch文

  • もし・・・の場合、〜する。
  • または×××の場合、〇〇〇する。
  • または…

// if文と比較してあまり利用されないが、文法として押さえておく
// switch (条件){
//     case 値1:
//         処理1;
//         break;
//     case 値2:
//         処理2;
//         break;
//     case 値3:
//         処理3;
//         break;
//     default:    // どれにも該当しない場合の処理
//         break;
// }

// sample code
$pref = "東京";

switch ($pref) {
   case "東京":
   case "神奈川":
   case "千葉":
   echo "関東です";
   break;

default:
   echo "該当なし";
   break;
}

// result
関東です


ループ処理

「〜の間」とある条件の間はずっと処理を繰り返したい場合、while文かfor文を使う。

for文(繰り返し文)

  • ・・・の間、〜する。
// for文の書き方
// for(初期条件; ループの終了条件;ループ毎に行う処理){
//   ループの中で行う処理
// }
// break;ループを抜ける
// contenue; 処理を中断し次のループに進む

// sample code 1
// 1から10まで数え、5になったらストップする
for ($i = 1; $i <= 10; $i++){
    if ($i === 6) {
    break;
}
echo $i . PHP_EOL;}
// result
1
2
3
4
5

// sample code 2
// for文と条件式の組み合わせ
// 30 ~ 60までの数字の中で2で割ったら奇数となる整数を数え、その個数を出力する
// 注意点 for と ifを組み合わせるときは、ifが入れ子(ネスト)にならないように注意する
​
// 数字の個数をカウントする空の変数 $count を定義
$count = 0;

// 開始条件:30 → 終了条件:60、$1に1足す
for ($i = 30; $i <= 60; $i++){
    // 2で割り切れる かつ 奇数(2で割って余りが1)の場合$countに1をたす
    if ($i % 2 === 0 && $i / 2 % 2 === 1){
        $count++;
    }
}
// 最後に$countを出力して個数を確認する
echo $count,PHP_EOL;
// sample code 3
// for文を使用した計算
// 1000未満の「3と7の倍数」の10番目に大きい数を出力する
​
// 数字の個数をカウントする空の変数 $count を定義
$count = 0;

// 開始条件:1000 → 終了条件:1、$1から1引く
for($i = 1000; $i >= 1; $i--){
    // 3と7の倍数があれば$countを「1」ずつ増やす
    if ($i % 3 === 0 && $i % 7 === 0) {
        $count++;
    }
    
    // $countが「10」以下のときの「$i」を表示。「break;」でループから抜け出す。
    if ($count >= 10) {
        // countが何番目かを出力
        echo $count.PHP_EOL;
        // cauntが10番目(10番目に大きい数)を出力
        echo $i. PHP_EOL;
        // 「break;」でループから抜け出す 
        break;
    }
}
// sample code 4
// 以下の図形をforを使って出力
//   #
//  ###
// #####

// 段数をn段に設定
// 繰り返し回数を$iに格納

// ひしがた上段の処理
$n = 3;
for($i = 0; $i < $n; $i++){
    // スペースを出力するためのカウントを$jに格納する
    // $iの数(菱形の段数)に応じてループ回数が変化→スペースを出力する
    for($j = 0; $j < ($n - 1) - $i; $j++){
        echo " ";
    }
    // # を出力するためのカウントを$kに格納する
    // $iの数(菱形の段数)に応じてループ回数が変化→0を出力する
    for($k = 0; $k <= $i * 2; $k++){
    echo "#";
    }
    echo PHP_EOL;
} 

【公式ドキュメント】
>> for


foreach文

// sample code 1
// foreach(配列 as $value){
// ループの中で行う処理
// }
$colors = array("red", "blue", "yellow");
foreach($colors as $value)
    {echo $value . "\n";}
// result
red
blue
yellow

// sample code 2
// foreach(連想配列 as $key =>$value){
// ループの中で行う処理
// }
$userScores = array( "tanaka" => 90, "yamada" => 80, "suzuki" => 70, );
foreach($userScores as $name =>;$score){
    echo "{$name}さんの点数は{$score}点です。".PHP_EOL;}
// result
tanakaさんの点数は90点です。
yamadaさんの点数は80点です。
suzukiさんの点数は70点です。

while文

  • while文(繰り返し文)
  • ・・・の間、〜する。
// while文の書き方
// 式がtrueの間、処理を繰り返す
//
// while(式){
//   実行したい処理
// }
// 無限ループにならないように式を書くこと

// sample code
$i = 1;
while ($i <= 10){
  echo $i . "\n";
  $i++;
}
// result
1
2
3
4
5
6
7
8
9
10

// sample code 3
// 100 → 200 までの数字 1桁目が5になったらループを終了
// 変数$1を100で初期化 → 200までループ
echo "-----",PHP_EOL,"for文",PHP_EOL,"-----",PHP_EOL;
for($i = 100; $i <= 200; $i++){
  // 条件式 1桁目が7の数字を判定
    if ($i % 10 === 5) {
        echo $i.PHP_EOL;
        // 1回目の処理で求める数字が出力されるため、処理を抜ける
        break;
    }
}

echo "-----",PHP_EOL,"while文",PHP_EOL,"-----",PHP_EOL;
// 変数$1を100で初期化 → 200までループ
$i = 100;
while($i <= 200){
    if ($i % 10 === 5) {
        echo $i.PHP_EOL;
        // 1回目の処理で求める数字が出力されるため、処理を抜ける
        break;
    }
$i++;
}

echo "-----",PHP_EOL,"do-while文",PHP_EOL,"-----",PHP_EOL;
// 変数$1を100で初期化 → 200までループ
$i = 100;
do {
    if ($i % 10 === 5) {
        echo $i.PHP_EOL;
        // 1回目の処理で求める数字が出力されるため、処理を抜ける
        break;
    }
    $i++;
} while ($i <= 200);
// result
-----
for文
-----
105

-----
while文
-----
105

-----
do-while文
-----
105

条件分岐を書くときの注意点

  • 条件で期待する処理が変わる場合はテストすること
  • 境界線テストの方法を利用がベターな場合がある

>> 境界値テストとは?ゲームを例に解説