51 votes

Empiler plusieurs opérateurs ternaires en PHP

Voici ce que j'ai écrit :

 $Myprovince = (
($province == 6) ? "city-1" :
($province == 7) ? "city-2" :
($province == 8) ? "city-3" :
($province == 30) ? "city-4" : "out of borders"
);

Mais pour chaque champ, j'ai obtenu la valeur city-4 . Je veux utiliser des opérateurs ternaires au lieu de switch/if parce que je veux expérimenter et voir comment cela se passerait.

Quel est le problème avec ce code ?

4voto

Renato Frota Points 1

Je pense que la manière la plus lisible d'écrire des opérateurs ternaires imbriqués en PHP est la suivante :

$myprovince =
    $province ==  6 ? "city-1" : (
    $province ==  7 ? "city-2" : (
    $province ==  8 ? "city-3" : (
    $province == 30 ? "city-4" : "out of borders" )));

Tout ce que vous devez faire, c'est compter le nombre de parenthèses ouvrantes ( ( ) et ajoutez le même nombre de parenthèses fermantes ( ) ) à la fin de la dernière ligne.

Une autre option consiste à utiliser des if/elseif/else d'une ligne, comme cela a déjà été suggéré - cependant, je les formaterais visuellement comme ceci pour une meilleure lisibilité :

if      ($province == 6)  $myprovince = "city-1";
elseif  ($province == 7)  $myprovince = "city-2";
elseif  ($province == 8)  $myprovince = "city-3";
elseif  ($province == 30) $myprovince = "city-4";
else                      $myprovince = "out of borders";

4voto

miken32 Points 8438

Une autre solution à ce problème a été introduite avec le site match déclaration en PHP 8 :

$Myprovince = match ($province) {
    6 => "city-1",
    7 => "city-2",
    8 => "city-3",
    30 => "city-4",
    default => "out of borders",
};

Il s'agit essentiellement d'une méthode moins verbeuse switch idéal pour une affectation simple. Il est également possible d'ajouter des conditions multiples :

$Myprovince = match ($province) {
    4, 5, 6 => "city-1",
    7, 9, 10 => "city-2",
    8 => "city-3",
    30 => "city-4",
    default => "out of borders",
};

3voto

krtek Points 15497

Essayez avec d'autres parenthèses :

$Myprovince = (
($province == 6) ? "city-1" :
(($province == 7) ? "city-2" :
(($province == 8) ? "city-3" :
(($province == 30) ? "city-4" : "out of borders"
))));

Votre code a un problème avec la priorité de l'opérateur ternaire.

Mais je pense que tu devrais vraiment laisser tomber cet opérateur et essayer d'utiliser une switch à la place.

2voto

Fandi Susanto Points 810

Je me suis retrouvé dans le même problème aujourd'hui. Les autres ont déjà donné des solutions acceptables. La mienne met simplement l'accent sur les "si" en une seule ligne. Plus lisible à mon avis.

if ($province == 6) $Myprovince = 'city-1';
elseif ($province == 7) $Myprovince = 'city-2';
elseif ($province == 8) $Myprovince = 'city-3';
elseif ($province == 30) $Myprovince = 'city-4';
else $Myprovince = 'out of borders';

1voto

Jonah Points 5434

Utilisez plutôt l'interrupteur. Les opérateurs ternaires ne devraient vraiment pas être utilisés pour plus d'une condition, car ils deviennent rapidement très difficiles à comprendre.

switch ($province) {
    case 6:
        $Myprovince = 'city-1';
        break;
    case 7:
        $Myprovince = 'city-2';
        break;
    case 8:
        $Myprovince = 'city-3';
        break;
    case 30:
        $Myprovince = 'city-4';
        break;
    default:
        $Myprovince = 'out of borders';
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X