Comment écrire un opérateur ternaire PHP

Comment écrire un opérateur ternaire PHP avec la portion elseif?

je vois des exemples de base avec le if et else portions de l'opérateur ternaire PHP comme ceci:

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

Comment puis-je obtenir la portion "elseif" comme ceci dans l'opérateur ternaire?

<?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';
  }
?>
41
demandé sur cale_b 2013-08-01 02:00:32

8 réponses

Un Ternaire n'est pas une bonne solution pour ce que vous voulez. Il ne sera pas lisible dans votre code, et il ya beaucoup de meilleures solutions disponibles.

Pourquoi ne pas utiliser un tableau de recherche "carte" ou "dictionnaire", comme ceci:

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

echo $vocations[$result->vocation];

un ternaire pour cette application finirait par ressembler à ceci:

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

Pourquoi est-ce mauvais? Parce que-en tant que seule ligne longue, vous n'obtiendriez aucune information de débogage valide si quelque chose se passait mal ici, la longueur le rend difficile à lire, plus l'imbrication des multiples ternaires sent juste étrange.

Un Standard Ternaire est simple, facile à lire, et ressemblerait à ceci:

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

ou

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

un ternaire est vraiment juste une façon pratique / plus courte d'écrire un simple if else déclaration. L'exemple ci-dessus ternaire est la même chose que:

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

cependant, un ternaire pour une logique complexe devient rapidement illisible, et ne vaut plus la peine brièveté.

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

même avec un formatage attentif pour l'étaler sur plusieurs lignes, ce n'est pas très clair:

echo($result->group_id == 1 
    ? "Player" 
    : ($result->group_id == 2 
        ? "Gamemaster" 
        : ($result->group_id == 3 
            ? "God" 
            : "unknown")));
85
répondu cale_b 2016-04-16 21:43:26

Puisqu'il s'agit d'une tâche courante, je suggère d'envelopper un commutateur/boîtier à l'intérieur d'un appel de fonction.

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);
8
répondu Orangepill 2013-07-31 22:11:00
echo ($result ->vocation == 1) ? 'Sorcerer'
        : ($result->vocation == 2) ? 'Druid'
           :  ($result->vocation == 3) ? 'Paladin'
                    ....

;

C'est un peu laid. Vous devriez coller avec la normale if consolidés.

7
répondu thelolcat 2014-06-04 14:24:54

comment écrire un opérateur ternaire PHP de base:

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

Exemple:

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

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

PHP opérateur ternaire avec un "elseif' entassées là:

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

mais s'il vous plaît ne nichez pas les opérateurs ternaires, sauf pour des trucs de salon. C'est une mauvaise odeur de code.

5
répondu Eric Leschinski 2015-05-04 18:26:05

pour être honnête, un opérateur ternaire ne ferait qu'empirer les choses, ce que je suggérerais si vous voulez simplifier c'est:

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

et puis un similaire pour les vocations

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

Avec un opérateur ternaire, vous vous retrouvez avec

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

comme vous pouvez le dire, seulement devient plus compliqué, plus vous ajoutez à cela

3
répondu bizzehdee 2013-07-31 22:05:19

je préférerais plutôt que des déclarations ternaires si-aller avec un commutateur-case. Par exemple:

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
répondu madshvero 2013-07-31 22:08:31

Vous n'auriez pas: c'est salissant et difficile à lire.

Vous êtes à la recherche pour le switch déclaration dans le premier cas. Le second est très bien comme il est mais pourrait encore être converti pour la cohérence

les énoncés ternaires sont beaucoup plus adaptés aux valeurs booléennes et à la logique alternative.

3
répondu exussum 2014-06-04 14:25:58
switch. Mais il ne semble un peu long.

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
répondu federicot 2013-07-31 22:09:22