2016-04-20 27 views
3

所以我理解這一點 - 並比較/檢查值。然而,我正在搞亂並注意到我的所有測試的結果都是一樣的 - 其中一些我被教導的(a)沒有工作或(b)是不正確的。PHP - 如果單個值等於多個選項

請注意,我正在運行PHP7。好吧,就我而言。我能夠實現相同的結果,檢查單個值是否等於多個選項之一...

這些工作...爲什麼?不是我學習的方式。

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

我通常會重複檢查,像這樣:if($stat == 'a' || $stat == 'b')甚至in_array()基本上是同樣的事情。

是第一個例子,對嗎?如果沒有,爲什麼它工作?或者這是一些皺眉,而不是練習 - 或者甚至是新的東西?

+4

閱讀[type juggling](http://php.net/manual/en/language.types.type-juggling.php)。 'in-review'不是一個空字符串,因此它是TRUE。所以你的第一個if語句表明if($ status =='in-progress'|| TRUE)。第二個說if($ status ==(true || true))。在PHP中,類型玩雜耍很重要? –

回答

6

首先要清楚==具有更高的precedence||。這意味着你的兩個if語句是這樣的:

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

現在對於你的第一個if語句,無論什麼樣的價值$status有什麼的($status == 'in-progress')的結果是,因爲你有一個或它和之後'in-review'你的if語句將永遠是真實的,因爲非空字符串是真值。

對於你的第二個陳述,這部分('in-progress' || 'in-review')字面上下降到TRUE || TRUE,它的計算結果爲TRUE。現在$status只需要保存一個真值,並且if語句將成立。

+0

謝謝!很好,清理了一下,學到了一些新東西。重新:優先。 –

+1

@MikeBarwick不客氣。 (另請參閱關於使用'=='時玩弄一個類型的類型:http://stackoverflow.com/q/80646/3933332) – Rizier123

3

不,該代碼將永遠不會工作。 ||==較低的優先級,所以你比較$status對第一個值,然後布爾||「或」其他值

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

您必須逐個比較值:

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

這對許多價值來說都很乏味。一個快速的黑客是使用數組:

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

我認爲Rizier123對於條件優先順序是正確的。 –

+1

'||'沒有更高的優先級;檢查手冊或看到:https://3v4l.org/0aBHu :) – Rizier123

+1

是的。只是看到了。無論如何,基本理論是成立的。 - 你沒有使用'||'來比較多個值,如 –