Wie verwende ich den ternären Operator (? :) In PHP als Abkürzung für "if / else"?

118

Anhand der Beispiele auf dieser Seite habe ich die folgenden Beispiele für funktionierenden und nicht funktionierenden Code.

Arbeitscode mit ifAnweisung:

if (!empty($address['street2'])) echo $address['street2'].'<br />';

Nicht funktionierender Code mit ternärem Operator:

$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

// Also tested this
(empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

UPDATE
Nach Brians Tipp stellte ich fest, dass das Echo $testdas erwartete Ergebnis ausgibt. Das Folgende wirkt wie ein Zauber!

echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />';
Steven
quelle
4
Es sieht richtig aus. Haben Sie versucht, $ test wiederzugeben?
Brian Fisher
Ihre Frage täuscht einige Freiwillige und Forscher, weil Sie keine Aufgabe mit einem ternären Kurzausdruck schreiben (es gibt keinen "Elvis-Operator") - Sie schreiben einen ternären Langhandausdruck. Der Unterschied besteht darin, dass Sie je nach Auswertung beide zurückgegebenen Werte deklarieren. Wenn in einer Kurzbewertung der Eingabewert "wahr" ist, wird er zurückgegeben. Wenn es sich um "falsey" handelt, wird der Fallback-Wert zurückgegeben (dies ist der Wert, der nach dem Elvis-Operator deklariert wurde). Auch hier ist der Null-Coalescing-Operator merklich schlecht implementiert.
mickmackusa

Antworten:

234

Das

(condition) ? /* value to return if condition is true */ 
            : /* value to return if condition is false */ ;

Die Syntax ist kein "Shorthand If" -Operator (der ?als bedingter Operator bezeichnet wird), da Sie Code nicht auf die gleiche Weise ausführen können, als ob Sie Folgendes getan hätten:

if (condition) {
    /* condition is true, do something like echo */
}
else {
    /* condition is false, do something else */
}

In Ihrem Beispiel führen Sie die echoAnweisung aus, wenn die $addressnicht leer ist. Mit dem bedingten Operator können Sie dies nicht auf die gleiche Weise tun. Was Sie jedoch tun können, ist echodas Ergebnis des bedingten Operators:

echo empty($address['street2']) ? "Street2 is empty!" : $address['street2'];

und dies zeigt "Straße ist leer!" Wenn es leer ist, wird andernfalls die Adresse street2 angezeigt.

John Rasch
quelle
Es ist der Unterschied zwischen Aussage und Ausdruck
Pmiranda
2
Was ist die Abkürzung nochmal? condition ?: falsewas bewertet, conditionob es wahr ist?
Oldboy
43

PHP 7+

Ab PHP 7 kann diese Aufgabe einfach mit dem Null-Koaleszenzoperator wie folgt ausgeführt werden :

echo !empty($address['street2']) ?? 'Empty';

Rabin Lama Dong
quelle
3
Nur zu Ihrer Information, wenn $address['street2']es sich um eine leere Zeichenfolge handelt. Es wird es akzeptieren und nicht zurückkehren 'Empty'. isset() != empty(). Dies wird nur funktionieren, wenn der Wertnull
AFwcxx
Nun, ich habe nur ein Beispiel geliefert. Aber ich habe den Code geändert. Vielen Dank !
Rabin Lama Dong
2
Was ist die Ausgabe, wenn sie $address['street2']nicht leer ist?
AliN11
Wenn $ address ['street2'] nicht leer ist, wird eine Form von "true" ausgegeben. Die übliche Form des oben Gesagten ist eher wie folgt: echo $address['street2'] ?? 'Empty';Wie bereits erwähnt, handelt es sich jedoch um den „ Null- Koaleszenz-Operator“, sodass nur auf Null und nicht auf Leer geprüft wird. Das ist weil ?? Ist effektiv eine Abkürzung für isset ().
Brian C
1
Ich habe mich angemeldet, um diese Antwort abzulehnen. Dies macht überhaupt nicht das, was beworben wird.
TKoL
28

Grundlegende Erklärung zu Richtig / Falsch

$is_admin = ($user['permissions'] == 'admin' ? true : false);

Bedingte Begrüßungsnachricht

echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';

Nachricht über bedingte Elemente

echo 'Your cart contains '.$num_items.' item'.($num_items != 1 ? 's' : '').'.';

ref: https://davidwalsh.name/php-ternary-examples

Arun Yokesh
quelle
2
Sie haben es von der Kurzhand-Website erhalten und nicht einmal darauf verwiesen
Richard
1
@ Richard fügte Referenzen hinzu
Arun Yokesh
Ist es ? Im Kontext von StackOverflow ist es immer eine dünne Linie. Ich meine, der Q hat nach etwas gefragt, kann es nicht selbst finden, und dann hat jemand anderes diesen Inhalt geliefert. Ist es unfair, vorhandene Inhalte zu kopieren, wenn dies hilfreich ist und einen Mehrwert für diese Fragen und Antworten bietet? Ich denke, Antworten auf StackOverflow sind nicht "Ihr eigener Inhalt" ... hmmm
Sliq
Das erste Beispiel ist falsch. Das )ist verlegt. Es sollte vor dem ?. Die vollständige Erklärung sollte$is_admin = ($user['permissions'] == 'admin') ? true : false;
1934286 vor
12

Der ternäre Operator ist nur eine Abkürzung für und if / else-Block. Ihr Arbeitscode hat keine else-Bedingung und ist daher nicht dafür geeignet.

Das folgende Beispiel funktioniert:

echo empty($address['street2']) ? 'empty' : 'not empty';
adrianbanks
quelle
6

Es ist der ternäre Operator, auch bekannt als Elvis-Operator (google it: P), den Sie suchen.

echo $address['street2'] ?: 'Empty'; 

Es gibt den Wert der Variablen oder den Standardwert zurück, wenn die Variable leer ist.

Tastatur Ninja
quelle
@Structed Ich kann nicht widersprechen, was Sie sagen, aber wenn Sie danach googeln, erhalten Sie das richtige Ergebnis und es ist einfacher, daran zu erinnern
Keyboard Ninja
4

Beachten Sie, dass Sie bei Verwendung verschachtelter bedingter Operatoren möglicherweise Klammern verwenden möchten , um mögliche Probleme zu vermeiden!

Es sieht so aus, als ob PHP nicht so funktioniert wie mindestens Javascript oder C #.

$score = 15;
$age = 5;

// The following will return "Exceptional"
echo 'Your score is: ' . ($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average'));

// The following will return "Horrible"
echo 'Your score is: ' . ($score > 10 ? $age > 10 ? 'Average' : 'Exceptional' : $age > 10 ? 'Horrible' : 'Average');

Der gleiche Code in Javascript und C # gibt in beiden Fällen "Außergewöhnlich" zurück.

Im zweiten Fall macht PHP (oder zumindest verstehe ich das):

  1. ist $score > 10 ? Ja
  2. ist $age > 10? nein, also der Strom$age > 10 ? 'Average' : 'Exceptional' gibt also "Außergewöhnlich" zurück.
  3. Anstatt nur die gesamte Anweisung anzuhalten und 'Exceptional' zurückzugeben, wird die nächste Anweisung weiter ausgewertet
  4. Die nächste Aussage wird 'Exceptional' ? 'Horrible' : 'Average'"Horrible" zurückgeben, da "Exceptional" wahr ist

Aus der Dokumentation: http://php.net/manual/en/language.operators.comparison.php

Es wird empfohlen, ternäre Ausdrücke nicht zu "stapeln". Das Verhalten von PHP bei Verwendung von mehr als einem ternären Operator in einer einzelnen Anweisung ist nicht offensichtlich.

user276648
quelle
3

Schneller und kurzer Weg:

echo $address['street2'] ? : "No";

Hier sind einige interessante Beispiele mit einer oder mehreren unterschiedlichen Bedingungen.

$color = "blue";

// Condition #1 Show color without specifying variable 
echo $color ? : "Undefined";
echo "<br>";

// Condition #2
echo $color ? $color : "Undefined";
echo "<br>";

// Condition #3
echo ($color) ? $color : "Undefined";
echo "<br>";

// Condition #4
echo ($color == "blue") ? $color : "Undefined";
echo "<br>";

// Condition #5
echo ($color == "" ? $color : ($color == "blue" ? $color : "Undefined"));
echo "<br>";

// Condition #6
echo ($color == "blue" ? $color : ($color == "" ? $color : ($color == "" ? $color : "Undefined")));
echo "<br>";

// Condition #7
echo ($color != "") ? ($color != "" ? ($color == "blue" ? $color : "Undefined") : "Undefined") : "Undefined";
echo "<br>";
Lernen und teilen
quelle
2

Bedingte Begrüßungsnachricht

echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';

Verschachtelte PHP-Kurzschrift

echo 'Your score is:  '.($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average') );
Adnan
quelle
2

Sie können diese sogar noch kürzer machen durch den Ersatz echomit<?= code ?>

<?=(empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />'?>

Dies ist insbesondere dann nützlich, wenn Sie in einer Navigationsleiste festlegen möchten, ob die Menüoption als bereits besucht (angeklickt) angezeigt werden soll oder nicht:

<li<?=($basename=='index.php' ? ' class="active"' : '')?>><a href="index.php">Home</a></li>

Pathros
quelle
Werden () in dieser <? =?> Methode benötigt?
Locken
0

Ich denke, Sie haben die Klammern falsch verwendet. Versuche dies:

$test = (empty($address['street2']) ? 'Yes <br />' : 'No <br />');

Ich denke es sollte funktionieren, du kannst auch verwenden:

echo (empty($address['street2']) ? 'Yes <br />' : 'No <br />');
user2909855
quelle
0

Ich denke, Sie sollten wahrscheinlich keinen ternären Operator in PHP verwenden. Betrachten Sie das nächste Beispiel:

<?php

function f1($n) {
    var_dump("first funct");
    return $n == 1;
}

function f2($n) {
    var_dump("second funct");
    return $n == 2;
}


$foo = 1;
$a = (f1($foo)) ? "uno" : (f2($foo)) ? "dos" : "tres";
print($a);

Wie denkst du, welche $aVariable wird enthalten? (Hinweis: dos) Und es bleibt gleich, auch wenn die $fooVariable 2 zugewiesen wird.

Um die Dinge besser zu machen, sollten Sie entweder die Verwendung dieses Operators ablehnen oder das rechte Teil folgendermaßen mit Klammern umgeben:

$a = (f1($foo)) ? "uno" : ((f2($foo)) ? "dos" : "tres");
rela589n
quelle
0

Ternary Operator ist im Grunde eine Abkürzung für if / else-Anweisung. Wir können damit nur wenige Codezeilen reduzieren und die Lesbarkeit verbessern.

Ihr Code sieht für mich sauberer aus. Aber wir können wie folgt sauberer vorgehen:

$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

Ein anderer Weg-

$test = ((empty($address['street2'])) ? 'Yes <br />' : 'No <br />');

Hinweis: Ich habe dem gesamten Ausdruck eine Klammer hinzugefügt, um ihn sauberer zu machen. Normalerweise habe ich dies getan, um die Lesbarkeit zu verbessern. Mit PHP7 können wir Null Coalescing Operator / PHP 7 verwenden? Betreiber für eine bessere Annäherung. Aber Ihre Anforderung passt nicht.

Ausnahme
quelle
-1

Es gibt auch einen ternären Kurzoperator, der folgendermaßen aussieht:

(Ausdruck1) ?: Ausdruck2 gibt Ausdruck1 zurück, wenn er als wahr ausgewertet wird, oder Ausdruck2 andernfalls.

Beispiel:

$a = 'Apples';
echo ($a ?: 'Oranges') . ' are great!';

wird zurückkehren

Apples are great!

Seit PHP 5.3 ist es möglich, den mittleren Teil des ternären Operators wegzulassen. Ausdruck expr1 ?: Expr3 gibt expr1 zurück, wenn expr1 TRUE ergibt, andernfalls expr3.

Aus dem PHP-Handbuch

horas_ro
quelle