Verschachtelte ternäre Anweisungen

8

Ich frage mich, warum das seltsam funktioniert. Ich verstehe, dass der Unterschied Gruppierung ist, aber spielt es im Vergleich eine Rolle?

%Vor%

gibt

zurück %Vor%

und

%Vor%

gibt es korrekt zurück

%Vor%

Warum gibt es einen Unterschied?

    
c4rrt3r 04.10.2011, 20:28
quelle

4 Antworten

13

Um eine Erklärung basierend auf Ihrem Code zu verwenden, wäre eine verkleinerte Version:

%Vor%

In PHP entspricht dies dem Schreiben:

%Vor%

Beim ersten Mal hat $i den Wert von 0 , also gibt das erste ternäre 'first_row' zurück und dieser String wird als Bedingung für das zweite Ternär verwendet - was im booleschen Kontext zu true führt - daher wird 'last_row' zurückgegeben.

Wenn Sie es neu gruppieren:

%Vor%

dann wird das Ergebnis des ersten Ternärs das zweite Ternär nicht stören.

    
webbiedave 04.10.2011, 21:03
quelle
4

Aus der offiziellen PHP-Dokumentation :

  

"Es wird empfohlen, dass Sie Ternary-Ausdrücke nicht" stapeln ". Das Verhalten von PHP bei der Verwendung von mehr als einem ternären Operator in einer einzigen Anweisung ist nicht offensichtlich"

Offenbar, obwohl der ternäre Operator von PHP (und ein Großteil seiner Syntax sonst) auf C basiert, entschied sich PHP aus irgendeinem Grund für macht es links-assoziativ , während in C und den meisten anderen darauf basierenden Sprachen Der ternäre Operator ist rechtsassoziativ :

C:

%Vor%

Perl:

%Vor%

Java:

%Vor%

JavaScript:

%Vor%

PHP:

%Vor%

Also, ja, ich denke, wir können mit Sicherheit sagen, dass PHP einfach (auch) in dieser Hinsicht Arsch-zurück ist.

    
Ilmari Karonen 04.10.2011 20:56
quelle
3

Siehe Beispiel 3 auf php.net :

%Vor%

Der wichtige Teil ist:

  

Dies liegt daran, dass ternäre Ausdrücke von links nach rechts ausgewertet werden

    
JRL 04.10.2011 20:33
quelle
0

Sehen Sie sich die Antwort von JRL an. Um zu verdeutlichen, was mit Ihrem Beispiel passiert, sollten Sie verstehen, dass Ihr Ausdruck als solcher bewertet wird:

%Vor%

Wenn also $i == 0 Ihre Aussage ist, wird dies im Wesentlichen so:

%Vor%

Da 'first_row' zu true auswertet,% 'last_row' ist das Ergebnis, das zurückgegeben wird, wenn $i == 0 . Wenn $i nicht gleich Null ist, wird Ihre Aussage im Wesentlichen so:

%Vor%     
New Guy 04.10.2011 20:58
quelle