2017-06-07 4 views
-1
<?php 
$var = 4; 
echo $current = ($var > 2) ? "gr than 2" : ($var > 6) ? "gr than 6" : "not gr than 2 or 6"; 
?> 

für den obigen Code, es immer zurück - gr als 6. Kann jemand bitte vorschlagen, was habe ich falsch?PHP verschachtelte ternäre wenn Bedingung

+2

Verwendung Klammern oder benutze if-then-else – Edwin

+1

'echo $ current = ($ var> 2)? (($ var> 6)?"gr als 6": "gr als 2"): "nicht gr größer als 2 oder 6"; ' – kRicha

+3

Mit ternären Operatoren wie diesem würde ich nicht empfehlen, es wird sehr schnell schwierig, die Logik zu erkennen und daher zu debuggen Anstatt ternäre Operatoren wie diesen zu verwenden, sollten Sie in Erwägung ziehen, zu einem einfachen 'if/if else/else' zurück zu wechseln. – Epodax

Antwort

1

Verwendung unter Code

<?php 
$var = 4; 
echo $current = (($var > 2) ? "gr than 2" : (($var > 6) ? "gr than 6" : "not gr than 2 or 6")); 
?> 
+1

Noch sollten Sie prüfen, ob '$ var> 6 'vor' $ var> 2' weil in Ihrer "Lösung "Wenn $ var gleich 8 ist, erhältst du' 'gr als 2" ' – Rafalon

2

Der Code wird von vorne nach hinten ausgeführt. Also zuerst

<?php 
($var > 2) ? "gr than 2" : ($var > 6) 
?> 

in "gr than 2" führen.

Dann wird das nächste Fragezeichen gr than 6 ergeben, weil gleich true ist.

Auch wegen der oben genannten wäre es gut zu bemerken, dass > 6 und > 2 beide greater than 2 sind, so dass die ganze Linie eigentlich ziemlich sinnlos ist, wie es geschrieben wird.

<?php 
$var = 4; 
echo $current = ($var < 2 ? "not gr than 2 or 6" : ($var > 6 ? "gr than 6" : "gr than 2")); 
?> 

* Edit:: *

Vielen Dank für die upvotes

Die Lösung wäre so etwas wie sein. Wenn ich das nochmal ansehe, bin ich in meinem eigenen Post verloren gegangen, weil die Logik so komplex ist. Also für andere Lektüre dieses:

Die Logik der OP geschrieben kann auf folgende Werte vereinfacht werden:

<?php 
echo true ? "first" : false ? "second" : "third"; 

Die OP würde erwarten, dass dies in first führen. Es führt jedoch zu second, weil zuerst der erste Teil ausgeführt wird, und da dieser Teil true ist, ist das Ergebnis "zweite".

+0

Ich war im Begriff, meine Antwort zu senden. +1 Für Erwähnung _wobei "gr als 2" gleich true_ ist und zeigt, wie es "gruppiert" ist. – FirstOne

+0

Auch +1 für den Hinweis, dass das Hinzufügen von Klammern es unmöglich machen würde, "gr als 6" zu erreichen, da es in "gr than 2" fallen würde. – Rafalon

1

Dies.

echo $current = ($var > 2) ? ($var >6)? "gr than 6":"lower than 6" : "lower than 2 or 6"; 
1

Sie können() verwenden, für jeden es conditions..try ..

echo $current = (($var > 2) ? "gr than 2" : (($var > 6) ? "gr than 6" : "not gr than 2 or 6"));

+0

Es funktioniert Mann. Vielen Dank. –

+1

Okai..niemals aufgeben ... wir brauchen wenig Code hohe Leistung..Sperf in der komplizierten Weise .. – Jana

1

die Priorität

<?php 
$var = 4; 
echo $current = ($var > 2) ? "gr than 2" : (($var > 6) ? "gr than 6" : "not gr than 2 or 6"); 
?> 
1

Die Lösung Klammern Gruppe Ihre Betreiber zu verwenden ist und auch die Reihenfolge der Bedingungen ein bisschen ändern:

echo $current = ($var > 2) ? 
    (($var > 6) ? "gr than 6" : "gr than 2") : 
    "not gr than 2 or 6 (smaller than 2)"; 

Das Problem in Ihrer Version ist, dass wird es wie folgt gruppiert nach Standard:

echo $current = (($var > 2) ? "gr than 2" : ($var > 6)) ? 
    "gr than 6" : 
    "not gr than 2 or 6"; 

Welche ist gleich:

echo $current = ("gr than 2") ? 
    "gr than 6" : 
    "not gr than 2 or 6";