2017-10-06 58 views
1
$array = ['a', 'b', 'c', 'd']; 
$vars = ['a', 'f', 'g']; 

foreach ($vars as $var) { 
    if (in_array($var, $array)) { 
     return true; 
    } else { 
     return false; 
    } 
} 

如何檢查是否存在於$array?只有其中一人必須是true如果所有的人都false這是沒有問題的,但如果有超過1 true值,檢查數組中是否存在多個變量中的一個

例如['a', 'b', 'c', 'g']我想要的功能停在第一true值和結束該過程。

+2

在檢查完所有內容之前,不要「返回false」。在循環下移動「返回假」 – apokryfos

回答

2

對於我來說,你的問題已經得到了代碼是相當多的去了解這一點的最好辦法。你只需要在循環之後到return false移動,從而使所有的值得到處理:

foreach ($vars as $var) { 
    if (in_array($var, $array)) { 
    return true; 
    } 
} 

return false; 

這將相同的工作與array_intersect一個解決方案,但有12只需要處理的最小量的優勢循環。請看下面的數據:

$vars = [1, 2, 3, 4, ... 1,000,000,000]; 
$array = [1, 10, ...]; 

使用array_intersect需要檢查元素$vars元素$array一個解決方案,而打破了一個循環的只需要檢查,直到第一個解決方案比賽。如果兩個陣列非常大,則可以使用兩個嵌套的foreach循環進一步優化。

就像我在評論中提到的 - 如果你的數組很小,那麼只需使用array_intersect,你不會注意到任何區別,並且代碼更具可讀性。

+0

不會'返回false;'覆蓋'return true'如果這種形式匹配? – AXAI

+0

否 - 函數只會運行,直到它到達的第一個「return」語句。此後沒有任何處理。 – iainn

5

只需使用array_intersect功能:

$arr = ['a', 'b', 'c', 'd']; 
$vars = ['a', 'f', 'g']; 

$result = count(array_intersect($vars, $arr)) == 1;  
var_dump($result); // true 
+0

它需要'> = 1',否?另外,使用array_intersect代替基本循環的缺點是,你不能在第一個成功的結果中破解,所以它不是性能。雖然對於小陣列來說不是問題。 – iainn

+0

@iainn我猜'== 1'會更好,因爲我不希望用戶輸入兩個以上的有效值。 – AXAI

+0

@AXAI也許我誤解了。我認爲多個匹配值可以嗎?你只是想檢查*至少* 1.無論如何,如果它適合你,那麼這是重要的事情。 – iainn

相關問題