26 Stimmen

Wie verkettet man mehrere ternäre Operatoren in PHP?

Ich verwende häufig ternäre Operatoren, aber ich kann nicht mehrere ternäre Operatoren ineinander stapeln.

Ich bin mir bewusst, dass die Stapelung mehrerer ternärer Operatoren den Code weniger lesbar zu machen aber in manchen Fällen würde ich es gerne tun.

Das habe ich bis jetzt ausprobiert:

$foo = 1;
$bar = ( $foo == 1 ) ? "1" : ( $foo == 2 ) ? "2" : "other";
echo $bar; // display 2 instead of 1

Was ist die richtige Syntax?

64voto

Brandon Horsley Punkte 7666

Diese Klammern sind das, was Sie meiner Meinung nach stört.

Versuchen Sie

$foo = 1;
$bar = ($foo == 1) ? "1" : (($foo == 2)  ? "2" : "other");
echo $bar;

23voto

Konrad Rudolph Punkte 503837

Das Problem ist, dass PHP, im Gegensatz zu allen anderen Sprachen macht den Bedingungsoperator links-assoziativ. Dies macht Ihren Code kaputt - was in anderen Sprachen in Ordnung wäre.

Sie müssen Klammern verwenden:

$bar = $foo == 1 ? "1" : ($foo == 2 ? "2" : "other");

(Beachten Sie, dass ich die anderen Klammern aus Ihrem Code entfernt habe; diese waren jedoch korrekt, nur redundant).

10voto

Alnitak Punkte 324207

Sie benötigen einige Klammern um die rechts Handoperand:

$foo = 1;
$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");
echo $bar;

Der Interpreter von PHP ist defekt und behandelt Ihre Zeile:

$bar = ( $foo == 1 ) ? "1" : ( $foo == 2 ) ? "2" : "other";

als

$bar = (( $foo == 1) ? "1" : ( $foo == 2)) ? "2" : "other";

und da dieser linke Ausdruck als "wahr" bewertet wird, wird stattdessen der erste Operand des verbleibenden ternären Operators ("2") zurückgegeben.

4voto

John Parker Punkte 53226

Das könnte man so schreiben:

$bar = ($foo == 1) ? "1" : (($foo == 2) ? "2" : "other");

(d.h.: Einfach den "inneren" ternären Operator in Klammern einbetten.)

Allerdings würde ich wirklich Ich bin versucht, dies nicht zu tun, da es ungefähr so lesbar ist wie ein besonders unleserliches, stark verschmiertes Schriftstück - es gibt niemals eine Entschuldigung für die Verschleierung von Code, und das hier grenzt schon daran.

3voto

faken Punkte 6202

Setzen Sie Klammern um jeden inneren ternären Operator, damit die Priorität der Operatoren gewährleistet ist:

$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X