- PHPが気になっている人
- PHPを勉強し始めたばかりの人
- PHP初級技術者認定試験を受験しようと思っている人
こんにちは〜、Toyです!
本日もPHP技術者認定初級試験に向けた勉強を行っていきたいと思います。
前回は、『テキストと数の操作』について勉強しましたね。
本日のテーマは『ロジック〜判定と繰り返し〜』についてです。
真偽値
PHPプログラムのすべての式において、真(true)または偽(false)という真偽(boolean)値があります。真偽値は、処理内で条件分岐(if文など)する際に、ある条件式が正しいか誤りかを判定する時に利用されます。
判定に使用する値として、1つの値をもつスカラー値、計算式、そして比較演算子を用いた式などが利用されます。
スカラー値はほとんどがtrueとなりますが、例外もあります。
スカラー値の中で0、0.0、空の文字列(”)、0だけを含む文字列はfalseとなります。
さらに、当然ではありますが、falseや計算結果が0になる計算式もfalseとなります。
falseとなる文字列
if文
if文は条件分岐を行う関数の1つです。
<if()構文>
if (条件1) {
// 条件1がtrueの時の処理
} elseif (条件2) {
// 条件1がfalse、条件2がtrueの時の処理
} else {
// 条件2がfalseの時の処理
}
条件には値や式などが指定可能です。さらに、elseif以降は省略可能、elseifは増殖可能(=多分岐可)となっています。
<if()構文の使用例>
$num = 5;
// 2から$numを3で割った余りを引く
if (2-$num%3) {
print 'True';
} else {
print 'False';
}
上記の出力結果はこちらです。
False
等価演算子
前回の講座では、算術演算子や結合演算子について学習しましたが、演算子にはまだまだたくさん種類があります。
ここでは、値を比較することのできる比較演算子と否定することのできる否定演算子について学習します。
比較演算子を使うと、より複雑な条件式が組み立てられます。
演算子 | 役割 | |
---|---|---|
比較 | ==(等価演算子) | 値が等しい(型は不問) |
===(厳密等価演算子) | 値とデータ型が等しい | |
!=(不等価演算子) | 値が等しくない(型は不問) | |
!==(厳密不等価演算子) | 値かデータ型が等しくない | |
<(不等号演算子) | 超過 | |
>(不等号演算子) | 未満 | |
<=(不等号演算子) | 以下 | |
>=(不等号演算子) | 以上 | |
否定 | ! | 値を否定 (値がtrue → false、値がfalse → true) |
<厳密等価演算子(===)と等価演算子(==)の使用例>
$num = '1';
// $numが整数型の1ならtrue
if ($num === 1) {
print 'Best Match';
} elseif ($num == 1) {
print 'Partial Match';
} else {
print 'Mismatch';
}
出力結果は
Partial Match
となります。
比較
それでは、先ほど学習した比較演算子を用いて条件分岐を行います。
<比較1>
if (abs(-34) > abs(-12)) {
print 'w';
}
// 'book'と'pen'を辞書順で比較
if ('book' > 'pen') {
print 'a';
// 240と97を数値の大小で比較
} elseif ('240' < '97') {
print 'b';
} else {
print 'c';
}
出力結果は
wc
となります。
<比較2>
// 5と42を数値で比較
if ('5minuts' < 42) {
print '42';
} else {
print '5minuts';
}
このプログラムの出力結果は
42
です。
数値と文字列を不等号演算子を用いて比較する場合は以下のように比較されます。
- 文字列の先頭に数値がある場合
文字列側は、先頭の数値を用いて比較される - 文字列の先頭に数値がない場合
文字列側は、0として比較される
比較関数
PHPでは比較演算子の他にも比較用の関数が多数存在します。
今回は、strcmp()関数について紹介します。
strcmp()関数は、引数に2つの文字列をとります。1つ目の文字列が2番目の文字列よりも大きい場合(文字列1 > 文字列2)は正の数を返し、小さい場合(文字列1 < 文字列2)は負の数を返します。そして、比較する2つの文字列が等しい場合は、返り値が0となります。
ただし、文字列の大小は辞書順で決定され、数値も文字列として扱われます。
<strcmp()関数の使用例>
// 数値を辞書順で比較
if (strcmp(1234, 90) > 0) {
print 'Over';
} else {
print 'Under';
}
数値は文字列として扱われるので、1と9を辞書順で比較すると1の方が小さい(早い)ので出力結果は
Under
となります。
さらに、PHP7では宇宙船演算子(<=>)というものが導入されました。
宇宙船演算子は、strcmp()関数と同様に比較することができますが、数値同士や数値と文字列で比較する場合は、他の演算子と同様な条件で比較されます。
<宇宙船演算子(<=>)の使用例>
// 数値と文字列を比較
if ((0 <=> 'def') > 0) {
print 'Over';
} elseif ((0 <=> 'def') == 0) {
print 'Equal';
}else {
print 'Under';
}
出力結果は
Equal
です。
論理演算子
これまで、if()構文内の条件式は1つだけでしたが、論理演算子というものを使用すると複数の条件式を用いて判定することができます。
<論理演算子一覧>
演算子 | 役割 |
---|---|
式 && 式 | 左右の式がどちらともtrueであれば式全体がtrue |
式 || 式 | 式が1つでもtrueであれば式全体がtrue |
<論理演算子の使用例>
$score = 65;
// テストの点数が0点未満、または100点超過の場合
if (($score > 100) || ($score < 0)) {
print 'scoring error';
// テストの点数が85点以上、または100点以下の場合
} elseif (($score >= 85) &&($score <= 100)) {
print 'Excellent';
// テストの点数が70点以上、または85点未満の場合
} elseif (($score >= 70) &&($score < 85)) {
print 'Great';
// テストの点数が60点以上、または70点未満の場合
} elseif (($score >= 60) &&($score < 70)) {
print 'Good';
// その他(60点未満)の場合
}else {
print 'Study hard';
}
出力結果は
Good
となります。
また、上記のようなプログラムの場合、上から下に処理されていくため、elseifの条件は、左側の条件式のみでも同様に動作します。
while文
プログラムで処理を繰り返すことをループと言います。ループを中止する条件はif()構文の条件式と同様の論理式です。
while()構文はif()構文の繰り返しのようなもので、コードブロックを終了する度に条件式をチェックし、その結果がtrueで有る限り繰り返しコードブロックを実行します。
<while()構文>
while (条件) {
// 条件がtrueの時の処理
}
<while()構文の使用例>
$i = 0;
while ($i < 10) {
// ++$iは変数の利用前に1を追加
print ++$i;
}
出力結果は
12345678910
となります。
for文
繰り返し処理は、while()構文の他にfor()構文を利用することができます。
for()構文は繰り返す回数が決まっている場合に利用されます。
<for()構文>
for (初期処理; 条件; 後処理) {
// 条件がtrueの時の処理
}
<for()構文の使用例>
for ($i = 0; $i <= 15; $i++) {
if (($i %3 == 0) && ($i%5 == 0)) {
print 'Fizz Buzz';
} elseif ($i %3 == 0) {
print 'Fizz';
} elseif ($i %5 == 0) {
print 'Buzz';
} else {
print $i;
}
print "\n";
}
出力結果は
Fizz Buzz
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz Buzz
となります。
終わりに
この記事はこれらの本を参考にしています。
今回は「ロジック〜判定と繰り返し処理」について勉強しました。
次回は、「配列の操作」についてです。お楽しみに〜
# To be continued