PHP 3日目
第5章:演算子
算術演算子
左辺と右辺の値のデータ型を数値型に変更した後、数値同士を計算する。
echo '<h2>1回目の出力</h2>';
echo 5+2 . '<br>';
echo 5-2 . '<br>';
echo 5*2 . '<br>';
echo 5/2 . '<br>';
echo 5%2 . '<br>';
// 「+」は加算演算子としてのみ動く
// 文字列連結演算子は「.」になるのでJSと違う
2回目の出力で計算結果がおかしい
echo '<h2>2回目の出力</h2>';
echo '答えは' . 4+2 . '<br>';
// 1. '答えは' . 4 → 文字列連結:'答えは4'
// 2. '答えは4' + 2 → 加算演算子:0 + 2 = 2
// 文字列'答えは4'を「0」に変更して計算
// ※JSだと「NaN」が返ってくるが、PHPは計算してしまう…
// warningエラー:数値じゃない値と遭遇している
// 3. 2 . '<br>' → 文字列連結:'2<br>'
// ※開発時はエラーメッセージを「E_ALL」に設定して
// きちんと表示させること
echo '答えは' . 4-2 . '<br>';
// 足し算と同様の問題がある
// 【解決法】処理の優先順を変更する
echo '(修正)答えは' . (4+2) . '<br>';
echo '(修正)答えは' . (4-2) . '<br>';
// PHP8から「+」「-」は「.」よりも処理の優先順位が高くなった
// ()丸カッコを付けなくても計算結果を優先してくれる
// ※ただし、今まで通り()丸カッコを付けるクセを付けて置いたほうが良い
echo '答えは' . 4*2 . '<br>';
echo '答えは' . 4/2 . '<br>';
echo '答えは' . 4%2 . '<br>';
2回目の出力は「数値ではない値が使用されている」という旨のWarningエラーが表示され「2」「-2」が出力されている。同じ優先度の場合、文字列連結演算子と算術演算子は左から順に処理されていく。
計算不可能な式の結果
‘答えは’ . 4 + 2
warningエラー:数値じゃない値と遭遇している
1. ‘答えは’ . 4 → 文字列連結:’答えは4′
2. ‘答えは’ . ‘4’ + 2 → 数値「4」を文字列型に変換して文字列連結
3. ‘答えは4’ + 2 → 文字列連結後の値と数値「2」で足し算
4. 0 + 2 → 文字列「答えは4」を「0」に変換して計算
※JSだと「NaN」が返ってくるが、PHPは計算してしまう…
3. 計算結果は2 → 計算結果「2」
処理優先度を変える
「()丸カッコ」で囲むことで処理の優先度を上げることができる。
また、計算のルールに則り「+」「-」よりも「*」「/」「%」が優先される。
【参考】文字列の中に数字が含まれている場合
echo '<h2>3回目の出力</h2>';
echo '答えは' + 10 . '<br>'; //10
echo '10答えは' + 10 . '<br>'; //20
echo '答えは10' + 10 . '<br>'; //10
echo '答え10は' + 10 . '<br>'; //10
// エラーメッセージが出るけど計算はされる
// 文字列の先頭に数字があると
// 先頭の数字を数値に変換して計算する
// それ以外はすべて「0」として計算する
算術演算子を使用して金額計算
echo '<h2>2回目の出力</h2>';
echo '<p>税込金額(切り上げ):' . ceil($total) . '円</p>';
// ceil関数:端数の切り上げ
// 第1引数:丸め処理をする数値
// 戻り値:切り上げ処理された整数
echo '<p>税込金額(四捨五入):' . round($total) . '円</p>';
// round関数:浮動小数点数を丸める
// 第1引数:丸め処理をする数値
// 第2引数(省略可):丸める桁数(省略時0)
// 第3引数(省略可):丸め方を指定(省略時PHP_ROUND_HALF_UP:四捨五入)
// 戻り値:丸めた値
echo '<p>税込金額(切り捨て):' . floor($total) . '円</p>';
// floor関数:端数の切り捨て
// 第1引数:丸め処理をする数値
// 戻り値:切り捨て処理された整数
// 引数に配列を指定した場合はfalseを返す
数値を扱う関数
小数点の処理
切り上げ処理
ceil(int|float $value):float
必要に応じてvalueを切り上げ、 value
の次に大きい整数値を返す。
ceil() の戻り値は float 型となる。これは、float 値の範囲は通常 int よりも広いため。
丸め処理
round(int|float $val[,int $precision = 0[,int $mode = PHP_ROUND_HALF_UP ]]):float
valueを、指定したprecision(小数点以下の桁数)に丸めた値を返す。precision
を負またはゼロ(デフォルト) とすることも可能
// 四捨五入:PHP_ROUND_HALF_UP
// 五捨六入:PHP_ROUND_HALF_UP
// 偶数丸め:PHP_ROUND_HALF_EVEN
// 奇数丸め:PHP_ROUND_HALF_ODD
★第3引数が定数なのは、プログラムの可読性を高める目的がある。
数値指定でもround関数を動かせるが、可読性が低くなる。
切り捨て処理
floor(int|float $value):float
必要に応じてvalueを丸めることにより、 valueをこえない最大の整数の値を (float 型で) 返す。
floor() の戻り値は float 型のまま。これは、 float の範囲が int よりも広いため。 配列を渡した場合など、エラーが発生したときには false を返す。
echo '<h2>3回目の出力</h2>';
$num = 1000;
echo $num / 3 . '<br>';
echo round($num / 3) . '<br>';
echo round($num / 3, 2) . '<br>';
echo round($num / 3, -2) . '<br>';
インクリメント・デクリメント演算子
※JSと同じなので授業では飛ばし
演算子 | 名称 | 内容 |
---|---|---|
++ | インクリメント演算子 | 変数内の数値を1増やす |
— | デクリメント演算子 | 変数内の数値を1減らす |
インクリメント演算子:変数の数値を1増やす
前置置換
++$変数名
後置置換
$変数名++
インクリメント演算子は変数の前や後ろに付けることができる。
インクリメント演算子を付けると変数内の数値が1増える。インクリメント演算子つき変数のみ記述する場合はインクリメント演算子を前に付けても後ろに付けても処理内容は変わらない。
インクリメント演算子を前に付けた場合は
「変数の値を1増やしてから処理」
インクリメント演算子を後ろに付けた場合は
「処理の後に変数の値を1増やす」
※デクリメント演算子も同様
代入演算子
※JSと同じなので授業では飛ばし
「文字列連結代入演算子」だけ異なるので確認していく
左辺に右辺の値を代入し変数等の値を変更する際に使用する。
演算子 | 名称 | 内容 |
---|---|---|
= | 代入演算子 | 右辺の値を左辺に代入 |
.= | 文字列連結代入演算子 | 左辺の文字列に右辺の文字列を連結して代入 |
+= | 加算代入演算子 | 左辺の数値に右辺の数値を足し算した結果を代入 |
-= | 減算代入演算子 | 左辺の数値に右辺の数値を引き算した結果を代入 |
*= | 乗算代入演算子 | 左辺の数値に右辺の数値を掛け算した結果を代入 |
/= | 除算代入演算子 | 左辺の数値に右辺の数値を割り算した結果を代入 |
%= | 剰余代入演算子 | 左辺の数値に右辺の数値を割り算した余りを代入 |
加算代入演算子: 「+=」
文字列連結演算子: 「.=」
echo '<h2>1回目の出力</h2>';
$text1 = '2018年1月';
echo $text1 . 'お正月';
echo '<br>';
echo $text1; //変数の値は元のまま
echo '<h2>2回目の出力</h2>';
$text2 = '2018年1月';
$text2 = $text2 . 'お正月'; //文字列連結した結果を変数に代入
echo $text2;
echo '<h2>3回目の出力</h2>';
$text3 = '2018年1月';
$text3 .= 'お正月'; //代入演算子で短く記述
echo $text3;
echo '<h2>4回目の出力</h2>';
/*
※JSの時
let code = '<ul>';
code += '<li>aaa</li>';
code += '<li>bbb</li>';
code += '<li>ccc</li>';
code += '<li>ddd</li>';
code += '<ul>';
*/
$code = '<ul>';
$code .= '<li>aaa</li>';
$code .= '<li>bbb</li>';
$code .= '<li>ccc</li>';
$code .= '<li>ddd</li>';
$code .= '</ul>';
echo $code;
第6章:制御構文・比較演算子
※ココも基本的にJSと同じ
プログラムの基本処理
プログラム内で実行される処理を簡単に言い表すと以下の3つに分類できる。
1.順次処理:上から順番に処理を実行
2.分岐処理:条件によって処理を選択して実行
3.反復処理:条件が成立する間、繰り返し特定の処理を実行
プログラムはこの3つの処理を組み合わせて記述していく。
ここまでは上から順番に処理を実行する「順次処理」のみで記述してきたが、ここからは「分岐処理」や「反復処理」を学んでいく。
分岐処理
条件によって処理を分岐させる。ユーザが入力した値やクライアントの閲覧環境に応じて処理を分岐させるといったこともできる。
if文:条件の成否で2つの選択肢から1つを選択する
switch文:値を使って複数の選択肢から処理を選択する
三項演算子:条件の成否で2つの処理や値から1つを選択する
反復処理
条件式が成立する間、繰り返し特定の処理を実行し続ける。
while文:最初に条件を確認して繰り返し処理を実行する
do while文:最後に条件を確認して繰り返し処理を実行する
for:繰り返し回数を決めて処理を実行する
★new★ foreach:配列の部屋数分繰り返し処理を実行する
※PHPは配列の部屋番号に連番が保証されていないため
PHPには「foreach」が用意されている
比較演算子(関係演算子)
比較演算子は左辺と右辺の関係を調べ真偽値を返す。
関係が成り立っている時はtrue(真)、成り立っていない時はfalse(偽)を返す。
「分岐処理」「反復処理」の条件によく使う。
演算子 | 名称 | 内容 |
---|---|---|
=== | 厳密等価演算子 | 左辺と右辺がデータ型も含め等しい場合に真を返す |
== | 等価演算子 | 左辺と右辺が等しい場合に真を返す データ型が違う場合はどちらかに型を合わせて比較 |
!== | 厳密不等価演算子 | 左辺と右辺が等しくない場合に真を返す データ型が等しくない場合も真を返す |
!= | 不等価演算子 | 左辺と右辺が等しくない場合に真を返す データ型が違う場合はどちらかに型を合わせて比較 |
< | 小なり演算子 | 左辺が右辺より小さい場合に真を返す |
<= | 小なりイコール演算子 | 左辺が右辺より小さいか等しい場合に真を返す |
> | 大なり演算子 | 左辺が右辺より大きい場合に真を返す |
>= | 大なりイコール演算子 | 左辺が右辺より大きいか等しい場合に真を返す |
注意しなければいけない厳密等価演算子と等価演算子の結果
厳密等価演算子 | 結果 |
---|---|
10 === ’10’ | false |
true === 1 | false |
false === 0 | false |
10 === ’10倍’ | false |
10 === ‘番号10’ | false |
等価演算子 | 結果 |
---|---|
10 == ’10’ | true |
true == 1 | true |
false == 0 | true |
10 == ’10倍’ | true |
10 == ‘番号10’ | false |
真偽値の数値型変換
true → 1
false → ” → 0
文字列の型変換
’10倍’ → 10
‘番号10’ → 0
小なり(イコール)、大なり(イコール)演算子で文字列比較
文字列型同士の比較の場合は対象の文字の並び順で比較する。
文字数が多い場合は先頭の文字から順番に比較し、異なる文字のところで結果を出す。
式 | 結果 |
---|---|
1<‘A’ | false |
‘1’<‘A’ | true |
‘A'<‘a’ | true |
‘a'<‘あ’ | true |
‘あ'<‘か’ | true |
‘あ'<‘ア’ | true |
‘あ'<‘亜’ | true |
‘Aあ'<‘Aい’ | true |
文字列を小なり(イコール)、大なり(イコール)演算子で比較することはほとんどないが、「結果が出る」ということは知っておく。
第7章:if文・論理演算子
※JSと同じなので授業では飛ばし
少しおさらい・・・
// 値:年齢
$age = 16;
echo "年齢:{$age}歳<br>";
// 条件:20歳未満
if ($age < 20) {
echo '未成年';
}
echo '<h2>問題1:金額を変数管理(送料)</h2>';
// 商品の金額を変数で管理
// 商品の金額に応じて送料を変更
// 1,000円以上は送料無料
// 500円以上は送料「100円」
// 500円未満は送料「200円」
// 商品の金額と送料を画面に表示する
$price = 400;
$postage = 0;
if ($price < 500) {
$postage = 200;
} else if ($price < 1000) {
$postage = 100;
}
$payment = $price + $postage;
echo "商品:{$price}円<br>";
echo "送料:{$postage}円<br>";
echo "合計:{$payment}円<br>";
// 【解答例1】
echo '<p>【解答例】</p>';
$price = 1500;
if ($price > 1000) {
echo '<p>送料無料</p>';
} else if ($price >= 500) {
echo '<p>送料:100円</p>';
} else {
echo '<p>送料:200円</p>';
}
echo '<h2>問題2:在庫管理</h2>';
// 在庫を変数で管理
// 10以上は「〇」
// 1以上は「△:残り〇」
// 0は「×」
$stock = 8;
$result = '〇';
if ($stock < 10 && $stock >= 1) {
$result = "△(残り{$stock})";
} else if ($stock === 0) {
$result = "×";
}
echo "在庫状況:{$result}";
// 【解答例1】
echo '<p>【解答例】</p>';
$stock = 10;
if ($stock >= 10) {
echo '〇';
} else if ($stock >= 1) {
echo "△:残り{$stock}";
} else {
echo '×';
}
真偽値への変換
PHPは必要に応じて自動でデータ型を変換する。
例えば条件式の中に記述された値は真偽値に自動変換される。
boolval(真偽値に変換したい値)
「boolval関数」は真偽値に変換した値を返す。真偽値変換した値を調べたいときに使用する。
元のデータ型 | 元の値 | 真偽値型変換 |
---|---|---|
数値型 | 0 | false |
浮動小数点数型 | 0.0 | false |
文字列型 | ”(空文字) | false |
文字列型 | ‘0’ | false |
配列型 | [](空の配列) | false |
Null型 | null | false |
※上記以外の値はすべて「true」に真偽値変換
(覚えるのは「false」だけでOK)
元のデータ型 | 元の値 | 真偽値型変換 |
---|---|---|
数値型 | 10 | true |
浮動小数点数型 | 2.5 | true |
文字列型 | ‘あいう’ | true |
配列型 | [10,20] | true |
第8章:三項演算子
※JSと同じなので授業では飛ばし
第9章:switch文
※JSと同じだけど少し違う・・・
switch文の使い方
switch文は式と値に応じて複数の選択肢から一致する箇所の処理を実行するもの。
「式の値」と「caseの値」は等価演算子「==」で確認する。
★JSでは厳密等価演算子「===」で確認していた!!
if文は条件式の結果に応じて「true」ブロックと「false」ブロックの2つから選択した(二分岐)。switch文は選択する処理が2つ以上ある場合(多分岐)に適している。
switch(式の値){
case 値1:
値1と合致した時の処理
break;
case 値2:
値2と合致した時の処理
break;
:
default:
どのcaseにも該当しなかった時の処理
break;
}
case節:式の値と一致するか調べる
switch文は「true」「false」の判定ではなく、「式の値」とそれに対応した「case節の値」が合致するかで処理を選択する。case節は「case (半角スペース)値:」と記述する。
default節:該当するcase節がなかった時の処理(省略可能)
default節は該当するcase節がなかった場合に選択される。必要ない場合は省略してもOK。JavaScriptの場合default節はどこに記述してもOK(最初でもOK)ですが
最後に記述することが多い。
break文:switch文を終了させる(省略可能)
各case節の最後にbreak文を記述すると、該当するcase節の処理終了時点でswitch文を抜け次の処理に移行する。case節のbreak文を省略すると該当するcase節以降の処理を最後まで実行し続ける。もし別のcase節にbreak文があった場合はそこでswitch文を終了させる。
$num = 3;
echo '<h2>1回目の出力</h2>';
switch ($num) {
case 1:
echo '1の処理';
break;
case 2:
echo '2の処理';
break;
case 3:
echo '3の処理';
break;
default:
echo '該当なしの処理';
break;
}
// PHPのswitch文は等価演算子で合致を確認
// ※JSは厳密等価演算子で確認
// 「$num」が'3'でも'3あああ'でも
// 「3の処理」が表示される
echo '<h2>2回目の出力</h2>';
$text = '緑';
switch ($text) {
case '黒':
echo '規律';
break;
case '赤':
echo '活発';
break;
case '緑':
echo '信頼';
break;
}
echo '<h2>問題:トランプ</h2>';
// 変数に1~13の数値を管理
// 画面にトランプの数字もしくは記号を表示
// 例)1→A,8→8,12→Q
// switch文を使う
// 1~13以外は「不正な値」
$card = 1;
if ($card >= 1 && $card <= 13) {
switch ($card) {
case 1:
echo 'A';
break;
case 11:
echo 'J';
break;
case 12:
echo 'Q';
break;
case 13:
echo 'K';
break;
default:
echo $card;
break;
}
} else {
echo '不正な値';
}
echo '<h3>乱数で出す場合</h3>';
$card = mt_rand(1, 13);
switch ($card) {
case 1:
echo 'A';
break;
case 11:
echo 'J';
break;
case 12:
echo 'Q';
break;
case 13:
echo 'K';
break;
default:
echo $card;
break;
}