web-dev-qa-db-fra.com

Comment écrire un opérateur PHP)

Comment écrire un opérateur PHP) avec la partie elseif?

Je vois des exemples basiques avec les parties if et else 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 partie "elseif" comme celle-ci 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';
  }
?>
58
dynamitem

Un ternaire n'est pas une bonne solution pour ce que vous voulez. Il ne sera pas lisible dans votre code et de meilleures solutions sont disponibles.

Pourquoi ne pas utiliser un tableau "look" 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 qu'en tant que longue ligne, vous n'obtiendrez aucune information de débogage valide si quelque chose n'allait pas, la longueur rend la lecture difficile, de même que l'imbrication de plusieurs ternaires semble étrange.

n ternaire standard 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 n’est en réalité qu’un moyen pratique/court d’écrire un simple if else déclaration. Le ternaire ci-dessus est le même 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 brièveté.

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

Même avec une mise en forme attentive 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")));
109
cale_b

Étant donné que ce serait une tâche courante, je suggérerais de placer un commutateur/une casse dans 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);
10
Orangepill
echo ($result ->vocation == 1) ? 'Sorcerer'
        : ($result->vocation == 2) ? 'Druid'
           :  ($result->vocation == 3) ? 'Paladin'
                    ....

;

C’est un peu moche. Vous devriez vous en tenir aux instructions if normales.

7
thelolcat

Comment écrire un élément de base PHP Opérateur ternaire:

($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

A PHP opérateur ternaire avec un 'elseif' entassé dedans:

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

Mais s'il vous plaît, n'impliquez pas les opérateurs ternaires, à l'exception des artifices de parloir. C'est une mauvaise odeur de code.

5
Eric Leschinski

Vous ne le feriez pas: c’est difficile et difficile à lire.

Vous recherchez l’instruction switch dans le premier cas. La seconde est bien comme elle est mais peut toujours être convertie pour la cohérence

Les déclarations ternaires sont beaucoup plus adaptées aux valeurs booléennes et à l'alternance de la logique.

3
exussum

Pour être honnête, un opérateur ternaire ne ferait qu'aggraver la situation. Ce que je suggérerais, si vous voulez simplifier les choses, est de:

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

et puis un semblable pour vos vocations

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

Avec un opérateur ternaire, vous vous retrouveriez avec

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

Ce qui, comme vous pouvez le constater, ne fait que devenir plus compliqué à mesure que vous en rajoutez

3
bizzehdee

Je préférerais que les déclarations si ternaires soient assorties d'un commutateur. 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
madshvero

En plus de toutes les autres réponses, vous pouvez utiliser switch. Mais cela 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
federico-t

Vous pouvez aussi faire:

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

Au lieu de:

echo (true)  ? "yes" : "no";
1
Jann Anthony Briza