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

序章

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

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

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

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

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

このチュートリアルは、条件ステートメントの作成に使用される比較演算子の概要から始まります。 次に、PHPで条件文を書く方法を説明します。 if, else、 と elseif キーワード。 これには、次の論理演算子を使用した条件の結合も含まれます。 and また or. 最後に、状況をより正確に説明するためのいくつかの特別な条件演算子についても説明します。

比較演算子の概要

条件ステートメントは、条件が真であるか偽であるかを評価します。 これはほとんどの場合、2つの値を比較した結果です。 比較演算子は、その名前が示すように、2つの値を比較するために使用されます。 PHPは緩く型付けされた言語です。つまり、デフォルトでは、PHPは可能な場合に期待される結果に一致するようにデータ型を変更しようとします。 これは型ジャグリングと呼ばれ、比較演算子を使用するときに非常に重要になります。 例として、次の値はすべて、タイプが異なっていても等しいと見なされます。

false
0
0.0
''

PHPには、値とタイプ/値の組み合わせの両方の目的の比較を表すためのいくつかの比較演算子が用意されています。

  • 等しい == value で、型ジャグリングの後、前のコードブロックのすべての値が等しいことを意味します。

  • 同一 === typevalueの両方で、前の値はすべて異なるタイプであるため、同じではないことを意味します。

  • 等しくない != また <> value で、型ジャグリング後。 等しいの反対として、比較する false != 0 次のように評価します false 値が一致するためです。

  • 同一ではありません !== typevalueの両方で。 比較する false !== 0 評価するだろう true 値は同じように評価されますが、タイプが異なるためです。

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

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

  • 未満 < それを示すために使用されます 5 < 6 本当です。

  • より大きい > それを示すために使用されます 5 > 4 本当です。

  • 以下 <= 使用されているので、両方を示す 5 <= 55 <= 6 本当です。

  • 以上 >= 両方を示すために使用されます 5 >= 55 >= 4 本当です。

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

条件文を書く

比較演算子は、 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、およびに基づいて計算された30% iの割引 $subtotal. カート内のアイテムの数が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.

ネストされた条件ステートメント

入れ子人形のように、条件文には、その中に「入れ子になった」他の条件文が含まれる場合があります。 条件ステートメントをネストする場合、一貫したインデントを使用すると、読みやすさが大幅に向上します。 より多くのオプションを提供するために、割引を拡張してみましょう。

$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%を使用して割引を計算します。

これは私たちを else 2番目の条件のブロック。 ただの代わりに elseelseif ブロックは、二次割引のオプションを提供する前に、カート内のアイテムの数が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、に評価されます true .2は.15より大きいためです。 割引が計算され、最終条件ブロックが渡されます。

代替構文

前の例で示したように、条件ステートメントの最も一般的な構文は中括弧を使用することです。 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は空白を処理する方法のため、間のスペースを受け入れます elseif 中括弧を使用する場合: } else if (...){. ただし、コロンを使用してステートメントを定義するときにスペースを使用すると、PHPは解析エラーで失敗します。 elseif (...):. 実際には、スペースを避け、常にこれをシングルとして書くことをお勧めします elseif.

追加の比較演算子

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

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

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

  • そして and 両方の条件がなければならないと言います true.

  • または or どちらの条件も true またはそれらは両方である可能性があります true.

  • Xor xor 条件の1つだけが true.

  • しない ! 条件を否定するために使用され、評価から変更されます true 評価する false.

  • そして && 両方の条件がなければならないと言います true.

  • または || どちらの条件も true またはそれらは両方である可能性があります true.

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

割引の例でこれを使用する:両方が $country 変数はに設定されます USA カート内のアイテムが10以上であること、およびこれらの条件は、 and オペレーター:

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

この例には2つの条件があります $country === 'USA'count($cart) >= 10. これらの条件の両方が 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 次に、カートの数または小計の比較(あるいはその両方)のいずれかを次のように評価する必要があります。 true.

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

三項演算子

式が真の場合に1つの結果があり、同じ式が偽の場合に別の結果があるはずの場合、三項演算子を使用できます。 表現 (expr1) ? (expr2) : (expr3) に評価します expr2 もしも expr1 に評価します true、 と 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 もしも expr1 trueと評価され、 expr3 それ以外は。 ユーザー名または「Guest」という単語を表示するには、三項演算子は次のようになります。

echo $username ?: 'Guest';

これは次の場合に機能します $username 空の文字列に設定されていますが、 $username がまったく設定されていない場合、エラーが発生します。 The isset この状況では関数を使用できません。 isset($username) どちらかになります true また false、の値の代わりに $username. これにより、次のオペレーターに移動します。

ヌル合体演算子

null合体演算子(??)は、「シンタックスシュガー」(持つのは甘いが必須ではない)として追加されました。 isset(). 存在し、nullでない場合は、最初のオペランドを返します。 それ以外の場合は、2番目のオペランドを返します。 ユーザー名または「Guest」という単語を表示するには、null合体演算子を使用します。

echo $username ?? 'Guest';

宇宙船オペレーター

宇宙船オペレーター(<=>)は、2つの式を比較するために使用されます。 $a <=> $b. -1、0、または1を返します。 $a それぞれ(よりも小さい<)、 に等しい (=)、またはより大きい(>) $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"];
});

The usort 関数は2つの引数(関数に渡される値)を取ります。 最初の引数は $products 配列。 2つ目は、無名関数で、 usort 配列内の各項目をどう処理するかを関数化します。 の価格の場合 $item2 の価格よりも安い $item1、演算子は戻ります -1、移動します $item2$item1. 価格が同じ場合、オペレーターは戻ります 0、アイテムを同じ順序に保ちます。 最後に、 $item2 の価格よりも大きい $item1、演算子は戻ります 1$item2$item1、これも彼らが始めたのと同じ順序です。

代わりに、価格を昇順で並べ替えるには、 $item1$item2、比較の順序を変更します。

usort($products, function($item1, $item2) {
    return $item1["price"] <=> $item2["price"];
});

結論

条件付きステートメントは、プログラムの出力選択を決定するためのフロー制御を提供します。 これらはプログラミングの基本的な構成要素の1つであり、事実上すべてのプログラミング言語で見つけることができます。

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

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

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