wake-up-neo.com

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

Basierend auf den Beispielen von dieser Seite habe ich die folgenden Beispiele für funktionierenden und nicht funktionierenden Code.

Arbeitscode mit if Anweisung:

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 fand ich, dass $test gibt das erwartete Ergebnis aus. Das Folgende wirkt wie ein Zauber!

echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />';
96
Steven

Das

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

syntax ist kein "shorthand if" -Operator (der ? heißt der bedingte Operator), weil Sie Code nicht auf die gleiche Weise ausführen können, wie Sie es getan haben:

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

In Ihrem Beispiel führen Sie die Anweisung echo aus, wenn die Anweisung $address ist nicht leer. Dies können Sie mit dem bedingten Operator nicht auf die gleiche Weise tun. Was Sie jedoch tun können, ist echo das Ergebnis des bedingten Operators:

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

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

194
John Rasch

PHP 7+

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

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

37
Rabin Lama Dong

Grundlegende Richtig/Falsch-Erklärung

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

Bedingte Begrüßung

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' : '').'.';
26
Arun Yokesh

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 wird funktionieren:

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

Es ist der ternäre Operator a.k.a 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.

4
Keyboard ninja

Beachten Sie, dass wenn Sie verschachtelte bedingte Operatoren verwenden, möglicherweise Klammern verwenden möchten, um mögliche Probleme zu vermeiden!

Es sieht so aus, als ob PHP funktioniert nicht so 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');

Derselbe Code in Javascript und C # gibt in beiden Fällen "Exceptional" zurück.

Im zweiten Fall ist das, was PHP tut (oder zumindest das, was ich verstehe):

  1. ist $score > 10? Ja
  2. ist $age > 10? nein, also der aktuelle $age > 10 ? 'Average' : 'Exceptional' gibt "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' was 'Horrible' als 'Exceptional' zurückgibt, ist wahr

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 der Verwendung von mehr als einem ternären Operator in einer einzelnen Anweisung ist nicht offensichtlich.

3
user276648

Sie können dies noch kürzer machen, indem Sie echo durch <?= code ?> Ersetzen.

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

Dies ist besonders 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>

2
Pathros

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

$value1 = '1';
$value2 = '2';
$value3 = '3';

// 1 Condition
$v1 = ($value1 == '1') ? TRUE : FALSE;
var_dump($v1);
echo "<br>";

// 2 Conditions
$v2 = ($value1 == '' ? TRUE : ($value2 == '2' ? TRUE : FALSE));
var_dump($v2);
echo "<br>";

// 3 Conditions
$v3 = ($value1 == '' ? TRUE : ($value2 == '' ? TRUE : ($value3 == '3' ? TRUE : FALSE)));
var_dump($v3);
echo "<br>";

// 4 Conditions
$v4 = ($value1 == '1') ? ($value2 == '2' ? ($value3 == '3' ? TRUE : 'FALSE V3') : 'FALSE V2') : 'FALSE V1' ;
var_dump($v4);
echo "<br>";

Bedingte Begrüßung

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

Verschachtelt PHP Shorthand

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

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

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

Ich denke, es sollte funktionieren, Sie können auch verwenden:

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