web-dev-qa-db-ja.com

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

例に基づいて このページから に、以下の動作中および動作しないコードサンプルがあります。

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 />';

UPDATE
ブライアンのヒントの後、$testをエコーすると期待される結果が出力されることがわかりました。以下は魅力のように動作します!

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

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

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

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

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

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

これにより、「Street is empty!」と表示されます。空の場合は、それ以外の場合、street2アドレスが表示されます。

194
John Rasch

PHP 7以降

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

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

37
Rabin Lama Dong

基本的な真/偽の宣言

$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' : '').'.';
26
Arun Yokesh

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

次の例が機能します。

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

それはあなたが探している三位一体演算子、エルビス演算子(グーグルit:P)です。

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

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

4
Keyboard ninja

ネストされた条件演算子を使用する場合、、考えられる問題を回避するために括弧を使用することができます。

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. その後、ステートメント全体を停止して「例外」を返すのではなく、次のステートメントの評価を続けます
  4. 次のステートメントは'Exceptional' ? 'Horrible' : 'Average'になり、 'Exceptional'は真実であるため 'Horrible'を返します

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

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

3
user276648

echo<?= code ?>に置き換えることで、これをさらに短縮できます

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

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

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

2
Pathros

以下に、1つまたは複数のさまざまな条件を持つ興味深い例を示します。

$value1 = '1';
$value2 = '2';
$value3 = '3';

// 1 Condition
$v1 = ($value1 == '1') ? TRUE : FALSE;
var_dump($v1);
echo "<br>";

// 2 Conditions
$v2 = ($value1 == '' ? TRUE : ($value2 == '2' ? TRUE : FALSE));
var_dump($v2);
echo "<br>";

// 3 Conditions
$v3 = ($value1 == '' ? TRUE : ($value2 == '' ? TRUE : ($value3 == '3' ? TRUE : FALSE)));
var_dump($v3);
echo "<br>";

// 4 Conditions
$v4 = ($value1 == '1') ? ($value2 == '2' ? ($value3 == '3' ? TRUE : 'FALSE V3') : 'FALSE V2') : 'FALSE V1' ;
var_dump($v4);
echo "<br>";

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

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
Adnan

ブラケットを間違った方法で使用したと思います。これを試して:

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

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

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