2016-04-20 19 views
3

Also verstehe ich das - und Vergleichen/Überprüfen von Werten. Allerdings habe ich herumgemotzt und das Ergebnis für alle meine Tests war die gleichen - einige von denen ich gelernt wurde (a) hat nicht funktioniert oder (b) war inkorrekt.PHP - wenn einzelner Wert gleich mehrere Optionen

Hinweis, ich verwende PHP7. Okay, auf meinen Punkt. Ich war in der Lage, die gleiche Ergebnisprüfung zu erreichen, wenn ein einzelner Wert gleich einer von mehreren Optionen ist ...

Diese funktionieren ... warum? Def nicht wie ich es gelernt habe.

if ($status == 'in-progress' || 'in-review') 
// and even 
if ($status == ('in-progress' || 'in-review')) // kind of similar to ASP.NET Razor 

Ich würde normalerweise die Prüfung wiederholen, etwa so: if($stat == 'a' || $stat == 'b') oder sogar in_array(), die im Wesentlichen die gleiche Sache.

Sind die ersten Beispiele korrekt? Wenn nicht, warum funktioniert es? Oder ist das etwas verpönt und nicht geübt - oder vielleicht sogar etwas Neues?

+4

Lesen Sie auf [Typ Jonglieren] (http://php.net/manual/en/language.types.type-juggling.php). 'in-review' ist kein leerer String, also ist es TRUE. Ihre erste if-Anweisung sagt also if ($ status == 'in-progress' || TRUE). Die zweite sagt if ($ status == (true || true)). Typ Jonglieren ist wichtig, um in PHP zu verstehen? –

Antwort

6

Zunächst einmal deutlich == hat eine höhere precedence als || zu machen. Dies bedeutet, dass Ihr zwei, wenn Aussagen wie folgt aussehen:

if (($status == 'in-progress') || 'in-review') 
if ($status == ('in-progress' || 'in-review')) 

nun für die erste if-Anweisung, unabhängig welchen Wert $status hat und was das Ergebnis von ($status == 'in-progress') ist, da Sie haben eine ODER darin und nach 'in-review' Ihre if-Anweisung wird immer wahr sein, da eine nicht leere Zeichenfolge ein truthy Wert ist.

Für Ihre zweite Aussage, dieser Teil ('in-progress' || 'in-review') kommt buchstäblich auf TRUE || TRUE, was TRUE ergibt. Jetzt $status muss nur einen truthy Wert halten und die if-Anweisung wird wahr sein.

+0

Vielen Dank! Schön, klar gemacht ... und etwas Neues gelernt. re: Vorrang. –

+1

@MikeBarwick Gern geschehen. (Siehe auch über den Typ Jonglieren gehen Sie mit '==': http://stackoverflow.com/q/80646/3933332) – Rizier123

3

Nein, dieser Code wird nie funktionieren. || hat eine niedrigere Priorität als ==, so dass Sie $status gegen den ersten Wert verglichen wird, dann boolean || „oder“ den anderen Wert

if (($status == 'foo') || ('bar')) 

Sie haben die Werte vergleichen individuell:

if (($status == 'foo') || ($status == 'bar')) 

Und das wird für viele Werte langweilig. Eine schnelle Hack ist ein Array zu verwenden:

if (in_array($status, array('foo', 'bar', 'baz', 'qux', 'etc...'))) 
+0

Ich denke, Rizier123 ist korrekt in Bezug auf die Rangfolge der bedingten. –

+1

'||' hat nicht die höhere Priorität; Überprüfen Sie das Handbuch oder sehen Sie: https://3v4l.org/0aBHu :) – Rizier123

+1

yeah. Ich habe das gerade gesehen. so oder so, die Grundtheorie. - Vergleichen Sie mehrere Werte wie folgt mit '||' –