PHPで条件文を書く方法

提供:Dev Guides
移動先:案内検索

著者は、 Write for DOnations プログラムの一環として、 Open Sourcing Mental IllnessLtdを選択して寄付を受け取りました。

序章

決定は人生の不可欠な部分です。 何を着るかについてのありふれた決定から、仕事や家族の人生を変える決定まで。 開発中もそうです。 プログラムが何か有用なことをするためには、ある種の入力に応答できなければなりません。 ユーザーがWebサイトの連絡先ボタンをクリックすると、連絡先ページに移動することを期待します。 何も起こらない場合、または間違ったページに移動した場合、ユーザーはそのWebサイトまたは会社の使用を完全に停止することを選択できます。

コードで記述された決定は、「xの場合はy」という条件を使用して形成されます。 ボタンのクリックでさえ、条件の一形態です。「このボタンがクリックされた場合、特定のページに移動します。」 条件付きステートメントは、コンピュータープログラムのロジック、意思決定、またはフロー制御の一部です。 条件文を「きみならどうする?」の本やフローチャートと比較することができます。

条件文を使用するいくつかの例を見てみましょう。

  • 学生が65% onを超えるテストを受けた場合は、成績が合格したことを報告してください。 そうでない場合は、彼女の成績が失敗したことを報告してください。
  • アカウントにお金がある場合は、利息を計算します。 引き落とされた場合は、違約金を請求してください。
  • オレンジを10個以上購入した場合は、5%の割引を計算します。 購入数が少ない場合は、購入しないでください。
  • ユーザーの場所を確認し、国に基づいて正しい言語を表示します。
  • 送信時にフォームを送信するか、不足している必須フィールドの横に警告を表示します。
  • クリックイベントでドロップダウンを開くか、すでに開いている場合はドロップダウンを閉じます。
  • ホテルの予約フォームを表示しますが、ホテルが予約されている場合は表示しません。

条件を評価し、それらの条件が満たされているかどうかに基づいて実行するコードを割り当てる場合、条件付きコードを記述しています。

このチュートリアルは、条件ステートメントの作成に使用される比較演算子の概要から始まります。 次に、ifelse、および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, comparing false != 0 would evaluate as false because the values match.
  • 同一ではない !== in both タイプ and 価値. Comparing false !== 0 would evaluate to true because although the values evaluate the same, the type is different.

注:他の条件を無効にするように機能する感嘆符!に特に注意してください。


PHPは、同等で同一であることに加えて、値が互いにどのように関連しているかを表す比較演算子も提供します。

  • 未満 < is used to show that 5 < 6 is true.
  • より大きい > is used to show that 5 > 4 is true.
  • 以下 <= is used so show that both 5 <= 5 and 5 <= 6 are true.
  • 以上 >= is used to show that both 5 >= 5 and 5 >= 4 are true.

比較演算子が何であるかがわかったので、それらを使用して条件ステートメントを作成する方法を見てみましょう。

条件文を書く

比較演算子は、ifelse、およびelseifキーワードと組み合わせて使用され、プログラムのフローを制御する条件ステートメントを作成します。

ifステートメントの使用

条件が満たされた場合にのみ特定のコードを実行する場合は、条件付きifステートメント、括弧内の条件()、中括弧内で実行するコードを使用します。中括弧{}。 条件ステートメント内のコードは、条件がtrueと評価された場合にのみ実行されます。 条件がtrueでない場合、条件ステートメント内のコードは無視され、条件ステートメントの終了後も処理が続行されます。 これがコードでどのように見えるか見てみましょう:

if ($inventory > 0) {
    echo "Add to Cart";
}

文字列「カートに追加」は、変数$inventory0より大きい数値が含まれている場合にのみ表示されます。

または、条件の後に式が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 (...){を使用する場合、elseifの間のスペースを受け入れます。 ただし、コロンを使用してステートメントを定義するときにスペースを使用すると、PHPは解析エラーで失敗します:elseif (...):。 実際には、スペースを避け、常にこれを単一のelseifとして記述することをお勧めします。


追加の比較演算子

各条件ステートメントで単一の比較演算子を使用することは、比較演算子を使用する唯一の方法ではありません。 条件を組み合わせるだけでなく、条件の外で比較演算子を使用することもできます。

論理演算子を使用した条件の組み合わせ

両方が真である必要がある複数の条件がある場合、または同じ影響を与える複数の条件がある場合、条件ステートメントは論理演算子を使用して単一のブロックに結合できます。

  • and says that both conditions must be true.
  • または or says that either condition is true or they could both be true.
  • Xor xor says that only one of the conditions is true.
  • いいえ ! is used to negate a condition, which changes it from evaluating true to evaluating false.
  • && says that both conditions must be true.
  • または || says that either condition is true or they could both be true.

およびまたは演算子の2つの異なるバリエーションの理由は、それらが異なる優先順位で動作するためです。 演算子の優先順位は、2つの式を「緊密に」バインドする方法、または操作が評価される順序を指定します。 (演算子の優先順位に関するドキュメントを参照してください。)どちらの方法も完全に受け入れられ、ほとんどの状況で同じように機能します。 PHPの演算子では大文字と小文字が区別されません。つまり、演算子はOR(または、OrまたはoRと書くこともできますが、どちらもお勧めしません)。 混乱を最小限に抑えるために、最も重要なことは、どちらを選択しても一貫していることです。 例ではandorを使用します。これらは、読みやすいためです。

割引の例でこれを使用する:$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を使用して小計の比較に対して評価されるため、実際には意図したとおりに機能しません。 これは、国またはカウントの値に関係なく、$subtotal100以上の場合、完全な条件ステートメントはtrueと評価されることを意味します。

括弧を使用して、条件が意図した順序で評価されていることを確認できます。

$discount = 0;
if ($country === 'USA' and (count($cart) >= 10 or $subtotal >= 100)) {
    $discount = $subtotal * .3;
}

これで、国がその結果で評価される前に、カート数が小計比較で評価されます。 これにより、$countryUSAの値を要求し、カートの数または小計の比較(または両方)も[と評価する必要があるという望ましい結果が得られます。 X196X]。

2つの値を比較するために、条件付きブロック全体が必要ない場合もあります。 PHPには、状況をより正確に記述するための簡単な比較演算子がいくつか用意されています。

三項演算子

式が真の場合に1つの結果があり、同じ式が偽の場合に別の結果があるはずの場合、三項演算子を使用できます。 式(expr1) ? (expr2) : (expr3)expr1trueと評価される場合、expr2と評価され、expr3expr1false。 訪問者のユーザー名をifログインして表示し、そうでない場合は「ゲスト」という単語を表示するとします。 関数issetは、変数が実際に定義されていることを確認するため、この条件を評価するのに役立ちます。 変数が定義されている場合、issettrueを返します。 そうでない場合、issetfalseを返します。

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つであり、事実上すべてのプログラミング言語で見つけることができます。

このチュートリアルでは、値を比較するための比較演算子と、条件を組み合わせるための論理演算子の両方について説明しました。 ネストされたステートメントを確認し、条件を組み合わせながら、ifelse、およびelseifキーワードの使用法を示しました。 最後に、三項演算子、ヌル合体演算子、宇宙船演算子など、追加の比較演算子の使用を紹介しました。 条件文の練習を続けるには:

  • 別の演算子を使用してみてください:<>=====
  • 演算子をandまたはorと組み合わせます
  • 三元、ヌル合体、または宇宙船演算子を使用してifステートメントを再作成します

PHPでコーディングする方法の詳細については、PHPでコーディングする方法シリーズの他のチュートリアルを参照してください。