PHPで条件文を書く方法
著者は、 Write for DOnations プログラムの一環として、 Open Sourcing Mental IllnessLtdを選択して寄付を受け取りました。
序章
決定は人生の不可欠な部分です。 何を着るかについてのありふれた決定から、仕事や家族の人生を変える決定まで。 開発中もそうです。 プログラムが何か有用なことをするためには、ある種の入力に応答できなければなりません。 ユーザーがWebサイトの連絡先ボタンをクリックすると、連絡先ページに移動することを期待します。 何も起こらない場合、または間違ったページに移動した場合、ユーザーはそのWebサイトまたは会社の使用を完全に停止することを選択できます。
コードで記述された決定は、「xの場合はy」という条件を使用して形成されます。 ボタンのクリックでさえ、条件の一形態です。「このボタンがクリックされた場合、特定のページに移動します。」 条件付きステートメントは、コンピュータープログラムのロジック、意思決定、またはフロー制御の一部です。 条件文を「きみならどうする?」の本やフローチャートと比較することができます。
条件文を使用するいくつかの例を見てみましょう。
- 学生が65% onを超えるテストを受けた場合は、成績が合格したことを報告してください。 そうでない場合は、彼女の成績が失敗したことを報告してください。
- アカウントにお金がある場合は、利息を計算します。 引き落とされた場合は、違約金を請求してください。
- オレンジを10個以上購入した場合は、5%の割引を計算します。 購入数が少ない場合は、購入しないでください。
- ユーザーの場所を確認し、国に基づいて正しい言語を表示します。
- 送信時にフォームを送信するか、不足している必須フィールドの横に警告を表示します。
- クリックイベントでドロップダウンを開くか、すでに開いている場合はドロップダウンを閉じます。
- ホテルの予約フォームを表示しますが、ホテルが予約されている場合は表示しません。
条件を評価し、それらの条件が満たされているかどうかに基づいて実行するコードを割り当てる場合、条件付きコードを記述しています。
このチュートリアルは、条件ステートメントの作成に使用される比較演算子の概要から始まります。 次に、if
、else
、およびelseif
キーワードを含む、PHPでの条件ステートメントの記述について説明します。 これには、and
またはor
の論理演算子を使用した条件の組み合わせも含まれます。 最後に、状況をより正確に説明するためのいくつかの特別な条件演算子についても説明します。
比較演算子の概要
条件ステートメントは、条件が真であるか偽であるかを評価します。 これはほとんどの場合、2つの値を比較した結果です。 比較演算子は、その名前が示すように、2つの値を比較するために使用されます。 PHPは緩く型付けされた言語です。つまり、デフォルトでは、PHPは可能な場合に期待される結果に一致するようにデータ型を変更しようとします。 これは型ジャグリングと呼ばれ、比較演算子を使用するときに非常に重要になります。 例として、次の値はすべて、タイプが異なっていても等しいと見なされます。
false 0 0.0 ''
PHPには、値とタイプ/値の組み合わせの両方の目的の比較を表すためのいくつかの比較演算子が用意されています。
- 同等
==
in 価値, after type juggling, meaning all of the values in the previous code block are equal. - 同一
===
in both タイプ and 価値, meaning none of the previous values are identical, because they are all of different types. - 等しくない
!=
or<>
in 価値, after type juggling. As the opposite of equal, comparingfalse != 0
would evaluate asfalse
because the values match. - 同一ではない
!==
in both タイプ and 価値. Comparingfalse !== 0
would evaluate totrue
because although the values evaluate the same, the type is different.
注:他の条件を無効にするように機能する感嘆符!
に特に注意してください。
PHPは、同等で同一であることに加えて、値が互いにどのように関連しているかを表す比較演算子も提供します。
- 未満
<
is used to show that5 < 6
is true. - より大きい
>
is used to show that5 > 4
is true. - 以下
<=
is used so show that both5 <= 5
and5 <= 6
are true. - 以上
>=
is used to show that both5 >= 5
and5 >= 4
are true.
比較演算子が何であるかがわかったので、それらを使用して条件ステートメントを作成する方法を見てみましょう。
条件文を書く
比較演算子は、if
、else
、およびelseif
キーワードと組み合わせて使用され、プログラムのフローを制御する条件ステートメントを作成します。
if
ステートメントの使用
条件が満たされた場合にのみ特定のコードを実行する場合は、条件付きif
ステートメント、括弧内の条件()
、中括弧内で実行するコードを使用します。中括弧{}
。 条件ステートメント内のコードは、条件がtrue
と評価された場合にのみ実行されます。 条件がtrue
でない場合、条件ステートメント内のコードは無視され、条件ステートメントの終了後も処理が続行されます。 これがコードでどのように見えるか見てみましょう:
if ($inventory > 0) { echo "Add to Cart"; }
文字列「カートに追加」は、変数$inventory
に0
より大きい数値が含まれている場合にのみ表示されます。
または、条件の後に式が1つしかない場合、PHPでは中括弧を完全に省略できます。 PHPは、条件の後の最初の式を実行し、セミコロンで終わります。 これには、それらの間の空白が含まれます。 以下は、前の例と同じ方法で評価します。
if ($inventory > 0) echo "Add to Cart";
else
ブロックの使用
特定のコードを実行する場合は、else
ブロックを条件付きif
ステートメントに追加します。 if
ブロック内のコードは、ステートメントがtrue
と評価された場合にのみ実行されますが、else
bock内のコードは、ステートメントがtrue
。 買い物客が10個以上のアイテムを購入した場合に割引が適用される例を見てみましょう。
if (count($cart) >= 10) { $discount = $subtotal * .3; } else { $discount = 0; }
カート内のアイテムの数が10以上の場合、ステートメントはtrue
と評価され、$subtotal
に基づいて30% iの割引が計算されます。 カート内のアイテム数が10未満の場合、ステートメントはfalse
と評価され、else
ブロックが実行されますが、割引はありません。 比較は、count($cart) > 9
と書くこともできます。
注:は、$a
の余りであるモジュロの計算に%
が使用されるため、パーセントを計算するときにパーセント記号%
を使用できません。 $b
で割った値:3 % 8 = 2
。 代わりに、パーセントを計算するには、パーセンテージを100で割って小数に変換します。 したがって、30%
は30/100
、または0.30
、または0.3
です。 詳細については、PHPで数値を操作する方法をご覧ください。
else
ブロックを追加すると、コードがさらに混乱する場合があります。 else
ブロックなしで同じことを達成できるかどうかを検討する価値があります。 たとえば、前の条件は次のように書くこともできます。
$discount = 0; if (count($cart) >= 10) { $discount = $subtotal * .3; }
割引にはデフォルト値0
を設定し、条件が満たされた場合にのみ変更します。
elseif
ステートメントの記述
2番目の条件が必要な場合は、2番目の条件ステートメントを追加できます。
$discount = 0; if (count($cart) >= 5) { $discount = $subtotal * .15 } if (count($cart) >= 10) { $discount = $subtotal * .3; }
この方法で2番目のステートメントを追加する場合、PHPは、最初のステートメントが一致している場合でも、各ステートメントをチェックする必要があります。 カートに14個のアイテムがある場合、最初の条件付きステートメントはtrue
と評価されます。これは、14が5以上であるため、割引が15%に設定されるためです。 その後、2番目の条件ステートメントもtrue
と評価されます。これは、14も10以上であるため、値を上書きする割引を再び30%に設定するためです。
条件が正しい順序になっていない場合、これは間違った割引を返すことになる可能性もあります。 複数の条件が一致する可能性がある場合は、それらの条件を正しい順序で評価していることを再確認することをお勧めします。
elseif
ブロックを使用すると、コードをより明確に評価できます。
$discount = 0; if (count($cart) >= 10) { $discount = $subtotal * .3; } elseif (count($cart) >= 5) { $discount = $subtotal * .15 }
この場合、コードは最初に10以上の値をチェックします。 この最初のステートメントがtrue
と評価された場合、最初の条件付きブロック内のコードが実行され、他の条件付きステートメントは評価されません。 最初の条件が満たされない場合にのみ、次の条件が評価されます。
条件付きステートメントには、elseif
条件をいくつでも含めることができますが、else
は1つだけです。
ネストされた条件ステートメント
入れ子人形のように、条件文には、その中に「入れ子になった」他の条件文が含まれる場合があります。 条件ステートメントをネストする場合、一貫したインデントを使用すると、読みやすさが大幅に向上します。 より多くのオプションを提供するために、割引を拡張してみましょう。
$discount = 0; if ($country === 'USA') { if (count($cart) >= 10) { if ($coupon_discount > .3) { $discount = $subtotal * $coupon_discount; } else { $discount = $subtotal * .3; } } elseif (count($cart) >= 5) { if ($coupon_discount > .15) { $discount = $subtotal * $coupon_discount; } else { $discount = $subtotal * .15 } } }
この例では、割引は米国内のユーザーのみが利用できるため、割引を確認する前に、まず$country
変数がUSA
に設定されていることを確認します。 残りの条件は、その最初の条件がtrue
の場合にのみ到達します。
次に、カート内のアイテムの数が10以上であるかどうかを確認します。 この2番目の条件がtrue
の場合、$coupon_discount
の値が10個以上のアイテムを注文するための通常の30% dカウントよりも大きいかどうかを確認します。 この3番目の条件がtrue
の場合、$coupon_discount
を使用して$discount
を計算します。 それ以外の場合、この3番目の条件はfalse
であり、通常の30%を使用して割引を計算します。
これにより、2番目の条件のelse
ブロックに移動します。 else
だけでなく、elseif
ブロックを使用して、二次割引のオプションを提供する前に、カート内のアイテムの数が5以上であることを確認します。 もう一度、$coupon_discount
変数の値が、セカンダリボリュームディスカウントの15%よりも大きいかどうかを確認します。 この4番目の条件が真の場合、$coupon_discount
を使用して$discount
が計算されます。 それ以外の場合、この4番目の条件はfalse
であり、最後の割引である15%に達します。
今見たようなネストされた条件文は、特にレベルを追加し始めた場合、従うのが難しい場合があります。 可能であれば、ネストを削除するために条件ステートメントを書き直す方法を検討してください。 前の条件は、次のように書くこともできます。
$discount = 0; if ($country !== 'USA') { // no discount for non-us locations } elseif ($coupon_discount > .3) { $discount = $subtotal * $coupon_discount; } elseif (count($cart) >= 10) { $discount = $subtotal * .3; } elseif ($coupon_discount > .15) { $discount = $subtotal * $coupon_discount; } elseif (count($cart) >= 5) { $discount = $subtotal * .15; }
PHPでは空の条件付きブロックが許可されているため、最初に国を確認し、他の条件をスキップできます。 国が値USA
と一致しないことを意味する負の表現!==
に注意してください。 ブロックを完全に空のままにすることもできますが、コメントを追加すると、そのブロックを空のままにする意図が説明されます。
elseif
ブロックの場合、最も制限の厳しいものから始めて、下に向かって進みます。 20%(.2)相当のクーポンを持っている米国の誰かは、最初の3つのブロックをfalse
と評価します。 次に、3番目のelseif
に到達します。これは、.2が.15より大きいため、true
と評価されます。 割引が計算され、最終条件ブロックが渡されます。
代替構文
前の例で示したように、条件ステートメントの最も一般的な構文は中括弧を使用することです。 PHPは、各条件の間に長いコードブロックがある場合、または条件内で中括弧も使用するループが使用されている場合に、読みやすくするための代替構文を提供します。 この代替構文は、条件ステートメントの後にコロンを使用して記述され、endif;
ステートメントで条件ブロックを終了します。 割引の例は、次のようにこの代替構文で記述できます。
$discount = 0; if ($country !== 'USA'): // no discount for non-us locations elseif ($coupon_discount > .3): $discount = $subtotal * $coupon_discount; elseif (count($cart) >= 10): $discount = $subtotal * .3; elseif ($coupon_discount > .15): $discount = $subtotal * $coupon_discount; elseif (count($cart) >= 5): $discount = $subtotal * .15; else: $discount = $subtotal * .05; endif;
これらの条件付きブロック内にループをネストすることは許容されますが、これらの条件付きブロック内に中括弧の条件付きをネストすると、予期しない結果が生じる可能性があります。 中かっこまたはコロンのいずれかに固執するのが最善です。
注: PHPは空白を処理する方法のため、中括弧} else if (...){
を使用する場合、else
とif
の間のスペースを受け入れます。 ただし、コロンを使用してステートメントを定義するときにスペースを使用すると、PHPは解析エラーで失敗します:elseif (...):
。 実際には、スペースを避け、常にこれを単一のelseif
として記述することをお勧めします。
追加の比較演算子
各条件ステートメントで単一の比較演算子を使用することは、比較演算子を使用する唯一の方法ではありません。 条件を組み合わせるだけでなく、条件の外で比較演算子を使用することもできます。
論理演算子を使用した条件の組み合わせ
両方が真である必要がある複数の条件がある場合、または同じ影響を与える複数の条件がある場合、条件ステートメントは論理演算子を使用して単一のブロックに結合できます。
- と
and
says that both conditions must betrue
. - または
or
says that either condition istrue
or they could both betrue
. - Xor
xor
says that only one of the conditions istrue
. - いいえ
!
is used to negate a condition, which changes it from evaluatingtrue
to evaluatingfalse
. - と
&&
says that both conditions must betrue
. - または
||
says that either condition istrue
or they could both betrue
.
とおよびまたは演算子の2つの異なるバリエーションの理由は、それらが異なる優先順位で動作するためです。 演算子の優先順位は、2つの式を「緊密に」バインドする方法、または操作が評価される順序を指定します。 (演算子の優先順位に関するドキュメントを参照してください。)どちらの方法も完全に受け入れられ、ほとんどの状況で同じように機能します。 PHPの演算子では大文字と小文字が区別されません。つまり、演算子はOR
(または、Or
またはoR
と書くこともできますが、どちらもお勧めしません)。 混乱を最小限に抑えるために、最も重要なことは、どちらを選択しても一貫していることです。 例ではand
とor
を使用します。これらは、読みやすいためです。
割引の例でこれを使用する:$country
変数がUSA
に設定されていること、およびカート内のアイテムが10以上であることを確認するには、これらの条件を次のように組み合わせることができます。 and
演算子:
$discount = 0; if ($country === 'USA' and count($cart) >= 10) { $discount = $subtotal * .3; }
この例には、$country === 'USA'
とcount($cart) >= 10
の2つの条件があります。 これらの条件の両方がtrue
と評価された場合、そのブロック内のコードが実行されます。 この例では、and
演算子を使用しましたが、AND
または&&
演算子を使用しても、まったく同じ結果になる可能性があります。
同じ結果になる条件を組み合わせることもできます。 カートに10個以上のアイテムがあると30%の割引になる場合、または小計が100ドル以上あると30%の割引になる場合は、次の条件を組み合わせることができます。
$discount = 0; if (count($cart) >= 10 or $subtotal >= 100) { $discount = $subtotal * .3; }
3つ以上の条件を組み合わせることもできます。 ただし、それらの使用には特に注意してください。 国の評価とカート数および小計の比較を組み合わせてみましょう。
# BAD $discount = 0; if ($country === 'USA' and count($cart) >= 10 or $subtotal >= 100) { $discount = $subtotal * .3; }
この例は、国が最初にカートの数で評価され、次にor
を使用して小計の比較に対して評価されるため、実際には意図したとおりに機能しません。 これは、国またはカウントの値に関係なく、$subtotal
が100
以上の場合、完全な条件ステートメントはtrue
と評価されることを意味します。
括弧を使用して、条件が意図した順序で評価されていることを確認できます。
$discount = 0; if ($country === 'USA' and (count($cart) >= 10 or $subtotal >= 100)) { $discount = $subtotal * .3; }
これで、国がその結果で評価される前に、カート数が小計比較で評価されます。 これにより、$country
にUSA
の値を要求し、カートの数または小計の比較(または両方)も[と評価する必要があるという望ましい結果が得られます。 X196X]。
2つの値を比較するために、条件付きブロック全体が必要ない場合もあります。 PHPには、状況をより正確に記述するための簡単な比較演算子がいくつか用意されています。
三項演算子
式が真の場合に1つの結果があり、同じ式が偽の場合に別の結果があるはずの場合、三項演算子を使用できます。 式(expr1) ? (expr2) : (expr3)
はexpr1
がtrue
と評価される場合、expr2
と評価され、expr3
はexpr1
がfalse
。 訪問者のユーザー名をif
ログインして表示し、そうでない場合は「ゲスト」という単語を表示するとします。 関数isset
は、変数が実際に定義されていることを確認するため、この条件を評価するのに役立ちます。 変数が定義されている場合、isset
はtrue
を返します。 そうでない場合、isset
はfalse
を返します。
echo (isset($username)) ? 'Guest' : $username;
これは、次のif/else
ステートメントと同じです。
if (isset($username)) { echo 'Guest'; } else { echo $username; }
三項演算子の中央部分を省略できます。 式expr1 ?: expr3
は、expr1
がtrueと評価された場合はexpr1
を返し、それ以外の場合はexpr3
を返します。 ユーザー名または「Guest」という単語を表示するには、三項演算子は次のようになります。
echo $username ?: 'Guest';
これは、$username
が空の文字列に設定されている場合は機能しますが、$username
がまったく設定されていない場合は、エラーが発生します。 isset($username)
の出力は、$username
。 これにより、次のオペレーターに移動します。
ヌル合体演算子
ヌル合体演算子(??
)は、isset()
と組み合わせてターナリを使用する必要がある一般的なケースのために、「シンタックスシュガー」(持つのは甘いが必須ではない)として追加されました。 存在し、nullでない場合は、最初のオペランドを返します。 それ以外の場合は、2番目のオペランドを返します。 ユーザー名または「Guest」という単語を表示するには、null合体演算子を使用します。
echo $username ?? 'Guest';
宇宙船オペレーター
宇宙船演算子(<=>
)は、$a <=> $b
という2つの式を比較するために使用されます。 $a
がそれぞれ(<
)より小さい、(=
)に等しい、または(>
より大きい)の場合、-1、0、または1を返します。 )$b
:
echo 1 <=> 1; // 0 echo 1 <=> 2; // -1 echo 2 <=> 1; // 1
警告:宇宙船オペレーターはあまり使用されませんが、「ユーザー定義の並べ替え」(usort
)関数を作成するときに非常に便利です。 次の例には、まだなじみのない追加の概念が含まれています。 今すぐすべてのコードに従わなくても心配しないでください。 この例で何が起こっているのかを説明します。これらの概念については、後のチュートリアルで詳しく説明します。
一連の新製品を作成しましょう。 配列内の各製品は、製品属性の独自のネストされた配列になります。
$products = [ ['name'=>'Flippers', 'price'=>7.99], ['name'=>'Wet Suit', 'price'=>18.99), ['name'=>'Snorkel', 'price'=>2.99), ['name'=>'Mask', 'price'=>6.99), ];
ここで、この$products
配列を、各アイテムの価格で降順で並べ替えるとします。 これを行うには、usort
関数を使用します。この関数に、並べ替えロジックを処理する無名関数を渡します。 コードを見てみましょう:
usort($products, function($item1, $item2) { return $item2["price"] <=> $item1["price"]; });
usort
関数は2つの引数(関数に渡される値)を取ります。 最初の引数は$products
配列です。 2つ目は、無名関数で、usort
関数に配列内の各項目をどう処理するかを指示します。 $item2
の価格が$item1
の価格よりも低い場合、オペレーターは-1
を返し、$item2
を$item1
の前に移動します。 。 価格が同じ場合、オペレーターは0
を返します。これにより、アイテムは同じ順序に保たれます。 最後に、$item2
の価格が$item1
の価格よりも高い場合、オペレーターは1
を返し、[の後に$item2
を置きます。 X155X]、これも彼らが始めたのと同じ順序です。
代わりに価格を昇順で並べ替えるには、$item1
と$item2
の位置を反転します。これにより、比較の順序が変わります。
usort($products, function($item1, $item2) { return $item1["price"] <=> $item2["price"]; });
結論
条件付きステートメントは、プログラムの出力選択を決定するためのフロー制御を提供します。 これらはプログラミングの基本的な構成要素の1つであり、事実上すべてのプログラミング言語で見つけることができます。
このチュートリアルでは、値を比較するための比較演算子と、条件を組み合わせるための論理演算子の両方について説明しました。 ネストされたステートメントを確認し、条件を組み合わせながら、if
、else
、およびelseif
キーワードの使用法を示しました。 最後に、三項演算子、ヌル合体演算子、宇宙船演算子など、追加の比較演算子の使用を紹介しました。 条件文の練習を続けるには:
- 別の演算子を使用してみてください:
<
、>
、==
、===
- 演算子を
and
またはor
と組み合わせます - 三元、ヌル合体、または宇宙船演算子を使用して
if
ステートメントを再作成します
PHPでコーディングする方法の詳細については、PHPでコーディングする方法シリーズの他のチュートリアルを参照してください。