1. ホーム
  2. php

PHPの三項演算子の書き方 [重複]について

2023-09-15 01:26:54

質問内容

PHPの三項演算子でelseifの部分はどのように書けばいいのでしょうか?

を使った基本的な例を見かけますが ifelse の部分は、PHP の三項演算子ではこのようになります。

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';
  }
?>

どのように解決するのですか?

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

配列のルックアップ "map" または "dictionary" をこのように使ってはどうでしょうか。

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

echo $vocations[$result->vocation];

このアプリケーションのための三項対立は、結局のところ次のようになります。

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

なぜこれが悪いのでしょうか?なぜなら - 1つの長い行として、ここで何か問題が発生しても有効なデバッグ情報を得ることができず、長さによって読みづらくなり、さらに複数の3項が入れ子になっているのは奇妙に感じられるからです。

標準的な三項演算子 はシンプルで読みやすく、次のようになります。

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

または

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

三項演算子は、単純な if else ステートメントを書くための便利で短い方法です。 上のサンプルの三項と同じです。

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

しかし、複雑なロジックのための三項対立はすぐに読めなくなり、もはや簡潔さに見合うものではありません。

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")));