PHPで三項演算子(?:)を「if / else」の省略形として使用するにはどうすればよいですか?


118

このページの例に基づいて、私は以下の機能するコードと機能しないコードのサンプルを持っています。

ifステートメントを使用した作業コード:

if (!empty($address['street2'])) echo $address['street2'].'<br />';

三項演算子を使用した機能しないコード:

$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

// Also tested this
(empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

更新
ブライアンの助言の後、エコー$testが期待どおりの結果を出力することがわかりました。以下は魅力のように動作します!

echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />';

4
それは正しいようです。$ testをエコーし​​ようとしましたか?
ブライアンフィッシャー

あなたの質問は、いくつかのボランティアや研究者をだますことです。あなたは、省略形の三項式を使って課題を書いていない( "Elvis Operator"はありません)-手書きの三項式を書いているのです。違いは、評価に応じて両方の戻り値を宣言することです。簡単な評価では、入力値が「truthy」の場合、それが返されます。「false」の場合、フォールバック値が返されます(これはElvisオペレーターの後に宣言された値です)。ここにもNull Coalescing Operatorの著しく貧弱な実装があります。
mickmackusa

回答:


234

(condition) ? /* value to return if condition is true */ 
            : /* value to return if condition is false */ ;

次の?ようにコードを実行することができないため、構文は「省略形」演算子(これは条件演算子と呼ばれます)ではありません。

if (condition) {
    /* condition is true, do something like echo */
}
else {
    /* condition is false, do something else */
}

あなたの例ではecho$addressが空でないときにステートメントを実行しています。これを条件演算子で同じように行うことはできません。ただし、実行できるechoのは条件演算子の結果です。

echo empty($address['street2']) ? "Street2 is empty!" : $address['street2'];

これにより、「ストリートは空です」と表示されます。空の場合は、street2の住所が表示されます。


文と表現の違いです
プミランダ

2
もう一度速記は?condition ?: falseどれconditionが真かどうかを評価しますか?
オールドボーイ

44

PHP 7以降

PHP 7以降、このタスクは、次のようなNull結合演算子を使用するだけで実行できます。

echo !empty($address['street2']) ?? 'Empty';


3
参考までに、もし$address['street2']空の文字列なら。それはそれを受け入れ、戻りません'Empty'isset() != empty()。これは、値が次の場合にのみ機能しますnull
AFwcxx '31 / 07/31

さて、私は例を提供していました。しかし、私はコードを変更しました。よろしくお願いします!
Rabin Lama Dong

2
$address['street2']空でない場合の出力は何ですか?
AliN11

$ address ['street2']が空でない場合、何らかの形式の「true」が出力されます。上記の通常の形式はより似ています。echo $address['street2'] ?? 'Empty';ただし、前述のとおり、これは「null結合演算子」であるため、nullのみをテストし、空ではありません。それの訳は ??isset()の略記です。
ブライアンC

1
この回答に反対票を投じるためにサインインしました。これは宣伝されていることをまったく行いません。
TKoL

28

基本的な真/偽の宣言

$is_admin = ($user['permissions'] == 'admin' ? true : false);

条件付きウェルカムメッセージ

echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';

条件付きアイテムメッセージ

echo 'Your cart contains '.$num_items.' item'.($num_items != 1 ? 's' : '').'.';

参照:https : //davidwalsh.name/php-ternary-examples


2
あなたはそれを
Richard


それは...ですか ?StackOverflowのコンテキストでは、それは常に細い線です。つまり、Qが何かを要求しましたが、自分で見つけることができず、他の誰かがこのコンテンツを配信しました。このQ / Aに役立ち、付加価値がある場合、既存のコンテンツをコピーすることは不公平ですか?StackOverflowでの答えは「あなた自身のコンテンツ」ではないと思います...
hmmm

最初の例は正しくありません。)見当違いさ。の前に置く必要があり?ます。完全なステートメントは$is_admin = ($user['permissions'] == 'admin') ? true : false;
1934286

12

三項演算子は、if / elseブロックの省略形にすぎません。作業コードにはelse条件がないため、これには適していません。

次の例はうまくいきます:

echo empty($address['street2']) ? 'empty' : 'not empty';

6

これは、探しているTernaryオペレーター、つまりElvisオペレーター(google it:P)です。

echo $address['street2'] ?: 'Empty'; 

変数の値、または変数が空の場合はデフォルトを返します。


@Structed私はあなたの言うことに反対することはできませんが、これをグーグルすると適切な結果が得られ、思い出しやすい用語になります
キーボード忍者

4

ネストされた条件演算子を使用する場合、起こり得る問題を回避するために括弧使用したい場合があることに注意してください!

PHPは、少なくともJavaScriptまたはC#と同じようには動作しないようです。

$score = 15;
$age = 5;

// The following will return "Exceptional"
echo 'Your score is: ' . ($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average'));

// The following will return "Horrible"
echo 'Your score is: ' . ($score > 10 ? $age > 10 ? 'Average' : 'Exceptional' : $age > 10 ? 'Horrible' : 'Average');

JavaScriptとC#の同じコードは、どちらの場合も「Exceptional」を返します。

2番目のケースでは、PHPの機能は次のとおりです(または少なくともそれが私が理解していることです)。

  1. ありますか$score > 10?はい
  2. ありますか$age > 10?いいえ、したがって、現在$age > 10 ? 'Average' : 'Exceptional'は「Exceptional」を返します
  3. 次に、ステートメント全体を停止して「Exceptional」を返すのではなく、次のステートメントを評価し続けます
  4. 次のステートメントは'Exceptional' ? 'Horrible' : 'Average'、「例外的」が真実であるため「恐ろしい」を返すようになります

ドキュメントから:http : //php.net/manual/en/language.operators.comparison.php

3項式の「スタック」を避けることをお勧めします。1つのステートメント内で複数の三項演算子を使用する場合のPHPの動作は自明ではありません。


3

すばやく簡単な方法:

echo $address['street2'] ? : "No";

以下は、1つ以上のさまざまな条件を使用した興味深い例です。

$color = "blue";

// Condition #1 Show color without specifying variable 
echo $color ? : "Undefined";
echo "<br>";

// Condition #2
echo $color ? $color : "Undefined";
echo "<br>";

// Condition #3
echo ($color) ? $color : "Undefined";
echo "<br>";

// Condition #4
echo ($color == "blue") ? $color : "Undefined";
echo "<br>";

// Condition #5
echo ($color == "" ? $color : ($color == "blue" ? $color : "Undefined"));
echo "<br>";

// Condition #6
echo ($color == "blue" ? $color : ($color == "" ? $color : ($color == "" ? $color : "Undefined")));
echo "<br>";

// Condition #7
echo ($color != "") ? ($color != "" ? ($color == "blue" ? $color : "Undefined") : "Undefined") : "Undefined";
echo "<br>";

2

条件付きウェルカムメッセージ

echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';

ネストされたPHP省略形

echo 'Your score is:  '.($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average') );

2

これを次のように置き換えることechoでさらに短くすることができます<?= code ?>

<?=(empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />'?>

これは特に、ナビゲーションオプション内で、メニューオプションを既に訪問済み(クリック済み)として表示するかどうかを決定する場合に役立ちます。

<li<?=($basename=='index.php' ? ' class="active"' : '')?>><a href="index.php">Home</a></li>


その<?=?>メソッドには()が必要ですか?
カール

0

ブラケットの使い方を間違えたと思います。これを試して:

$test = (empty($address['street2']) ? 'Yes <br />' : 'No <br />');

私はそれがうまくいくと思います、あなたは使うこともできます:

echo (empty($address['street2']) ? 'Yes <br />' : 'No <br />');

0

PHPではおそらく三項演算子を使用すべきではないと思います。次の例を考えてみましょう:

<?php

function f1($n) {
    var_dump("first funct");
    return $n == 1;
}

function f2($n) {
    var_dump("second funct");
    return $n == 2;
}


$foo = 1;
$a = (f1($foo)) ? "uno" : (f2($foo)) ? "dos" : "tres";
print($a);

どのような$a変数が含まれると思いますか?(ヒント:dos)そして、それは同じままです$foo変数が2に割り当てられてです。

より良いものにするために、この演算子の使用を拒否するか、次のように右部分を中括弧で囲む必要があります。

$a = (f1($foo)) ? "uno" : ((f2($foo)) ? "dos" : "tres");

0

三項演算子は基本的にif / elseステートメントの省略形です。数行のコードを削減して読みやすくするために使用できます。

あなたのコードは私にはきれいに見えます。しかし、次のように、よりクリーンな方法を追加できます。

$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

別の方法-

$test = ((empty($address['street2'])) ? 'Yes <br />' : 'No <br />');

注-表現全体をきれいにするために、式全体にブラケットを追加しました。私は通常、これを読みやすくするためにこれを行っていました。PHP7では、Null Coalescing Operator / php 7を使用できますか?より良いアプローチのための演算子。しかし、あなたの要件は適合しません。


-1

簡単な3項演算子もあり、次のようになります。

(式1):?expression2が返されます式1をそれが本当かと評価された場合式2そう。

例:

$a = 'Apples';
echo ($a ?: 'Oranges') . ' are great!';

戻ります

Apples are great!

PHP 5.3以降、三項演算子の中間部分を省略することが可能です。式expr1?:expr1がTRUEと評価された場合、expr3はexpr1を返し、そうでない場合はexpr3を返します。

PHPマニュアルから

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.