web-dev-qa-db-ja.com

PHP三項演算子の書き方

Elseif部分でPHP三項演算子を書くにはどうすればよいですか?

次のようなPHP三項演算子のifおよびelse部分の基本的な例を参照してください。

echo (true)  ? "yes" : "no";    //prints yes
echo (false) ? "yes" : "no";    //prints no

このような「elseif」部分を三項演算子に取得するにはどうすればよいですか?

<?php 
  if($result->vocation == 1){
    echo "Sorcerer"; 
  }else if($result->vocation == 2){
    echo 'Druid';
  }else if($result->vocation == 3){
    echo 'Paladin';
  }else if($result->vocation == 4){
    echo 'Knight';
  }else if($result->vocation == 5){
    echo 'Master Sorcerer';
  }else if($result->vocation == 6){
    echo 'Elder Druid';
  }else if($result->vocation == 7){
    echo 'Royal Paladin';
  }else{
    echo 'Elite Knight';
  }
?>
58
dynamitem

Ternaryは、あなたが望むものに対する良い解決策ではありません。コードで読むことはできず、はるかに優れたソリューションが利用可能です。

次のように、配列ルックアップの「マップ」または「辞書」を使用しないのはなぜですか。

$vocations = array(
    1 => "Sorcerer",
    2 => "Druid",
    3 => "Paladin",
    ...
);

echo $vocations[$result->vocation];

このアプリケーションの3要素は次のようになります。

echo($result->group_id == 1 ? "Player" : ($result->group_id == 2 ? "Gamemaster" : ($result->group_id == 3 ? "God" : "unknown")));

なぜこれが悪いのですか?なぜなら、1つの長い行として、ここで何かがうまくいかないと有効なデバッグ情報が得られないため、長さが読みにくくなり、さらに複数の3項の入れ子が奇妙に感じられるからです。

A Standard Ternaryはシンプルで読みやすく、次のようになります。

$value = ($condition) ? 'Truthy Value' : 'Falsey Value';

または

echo ($some_condition) ? 'The condition is true!' : 'The condition is false.';

3項は、実際には単純なif elseステートメントを書くための便利で短い方法です。上記のサンプルの3項は次と同じです。

if ($some_condition) {
    echo 'The condition is true!';
} else {
    echo 'The condition is false!';
}

ただし、複雑なロジックの3項はすぐに判読できなくなり、簡潔にする価値はなくなります。

echo($result->group_id == 1 ? "Player" : ($result->group_id == 2 ? "Gamemaster" : ($result->group_id == 3 ? "God" : "unknown")));

それを複数の行に広げるための注意深いフォーマットを使用しても、あまり明確ではありません:

echo($result->group_id == 1 
    ? "Player" 
    : ($result->group_id == 2 
        ? "Gamemaster" 
        : ($result->group_id == 3 
            ? "God" 
            : "unknown")));
109
cale_b

これは一般的なタスクであるため、関数呼び出し内でスイッチ/ケースをラップすることをお勧めします。

function getVocationName($vocation){
    switch($vocation){
        case 1: return "Sorcerer"; break;
        case 2: return 'Druid'; break;
        case 3: return 'Paladin'; break;
        case 4: return 'Knight'; break;
        case 5: return 'Master Sorcerer'; break;
        case 6: return 'Elder Druid'; break;
        case 7: return 'Royal Paladin'; break;
        default: return 'Elite Knight'; break;
    }
}

echo getVocationName($result->vocation);
10
Orangepill
echo ($result ->vocation == 1) ? 'Sorcerer'
        : ($result->vocation == 2) ? 'Druid'
           :  ($result->vocation == 3) ? 'Paladin'
                    ....

;

ちょっといです。通常のifステートメントに固執する必要があります。

7
thelolcat

基本的なPHP三項演算子の書き方:

($your_boolean) ? 'This is returned if true' : 'This is returned if false';

例:

$myboolean = true;
echo ($myboolean) ? 'foobar' : "penguin";
foobar

echo (!$myboolean) ? 'foobar' : "penguin";
penguin

A PHP _elseif 'が詰め込まれた三項演算子:

$chow = 3;
echo ($chow == 1) ? "one" : ($chow == 2) ? "two" : "three";
three

しかし、パーラーのトリックを除いて、三項演算子を入れ子にしないでください。それは悪いコード臭です。

5
Eric Leschinski

面倒くさくて読みにくいです。

最初のケースでswitchステートメントを探しています。 2つ目はそのままでも問題ありませんが、一貫性を保つために変換できます

三項ステートメントは、ブール値と代替ロジックにより適しています。

3
exussum

正直に言うと、三項演算子はこれをさらに悪化させるだけであり、それをより単純にすることがあなたが目指しているものであるなら、私は提案するでしょう:

$groups = array(1=>"Player", 2=>"Gamemaster", 3=>"God");
echo($groups[$result->group_id]);

そして、あなたの職業のための同様のもの

$vocations = array(
  1=>"Sorcerer",
  2=>"Druid",
  3=>"Paladin",
  4=>"Knight",
  ....
);
echo($vocations[$result->vocation]);

三項演算子を使用すると、次のようになります

echo($result->group_id == 1 ? "Player" : ($result->group_id == 2 ? "Gamemaster" : ($result->group_id == 3 ? "God" : "unknown")));

あなたが言うことができるように、それはあなたがそれに追加するほどより複雑になります

3
bizzehdee

私は三項のif文ではなくスイッチケースを使いたいです。例えば:

switch($result->vocation){
case 1:
    echo "Sorcerer";
    break;
case 2:
    echo "Druid";
    break;
case 3:
    echo "Paladin";
    break;
case 4:
    echo "Knight";
    break;
case 5:
    echo "Master Sorcerer";
    break;
case 6:
    echo "Elder Druid";
    break;
case 7:
    echo "Royal Paladin";
    break;
default:
    echo "Elite Knight";
    break;
}
3
madshvero

他のすべての回答に加えて、switchを使用できます。しかし、それは少し長いように見えます。

switch ($result->vocation) {
case 1:
    echo 'Sorcerer';
    break;

case 2:
    echo 'Druid';
    break;

case 3:
    echo 'Paladin';
    break;

case 4:
    echo 'Knight';
    break;

case 5:
    echo 'Master Sorcerer';
    break;

case 6:
    echo 'Elder Druid';
    break;

case 7:
    echo 'Royal Paladin';
    break;

default:
    echo 'Elite Knight';
    break;
}
2
federico-t

次のこともできます。

echo "yes" ?: "no" // Assuming that yes is a variable that can be false.

の代わりに:

echo (true)  ? "yes" : "no";
1