2016-08-27 93 views
0

我正在檢查數組中是否存在所有需要的值。我想用array_intersect會是什麼,我應該使用:檢查一個數組中的所有值是否存在於另一個數組中

$required[0] = 'FirstName'; 
$required[1] = 'LastName'; 

$posted['Email'] = '[email protected]'; 
$posted['FirstName'] = 'Bob'; 
$posted['Group'] = '5'; 

print_r(array_intersect($required, $posted)); 

所以,我想,以確保「名字」和「姓氏」的$posted數組中存在。但是,「姓氏」丟失,但是這返回一個空數組結果。

我錯過了什麼?

回答

1

如果$posted最初來自$_POST在某些時候,(比如從輸入表單上的值),所有的鍵將被設置,即使一些可能設置爲''。由於您的鍵爲$required陣列中的值,因此最好只檢查循環中的必需字段。您可以使用empty來同時驗證它們是否存在並具有真值。假設下面的代碼是一個函數或文件的內容的身體,這樣的事情應該工作:爲什麼你有array_intersect做的方式是行不通的

foreach ($required as $requirement) { 
    // if everything has to have a value, just return false as soon as something doesn't 
    if (empty($posted[$requirement]) return false; 
} 
return true; 

部分原因是功能檢查$required中的值與$posted中的值,並且您需要檢查$required中的值與中的鍵中的$posted中的值。另一部分是array_intersect將返回兩個數組共有的值,而不是丟失的值。

如果$posted中的某些鍵確實可能不存在,則最好使用鍵而不是按值定義$required數組,然後使用array_diff_key

$required['FirstName'] = true; 
$required['LastName'] = true; 

$missing_requirements = array_diff_key($required, $posted); 

如果$required每個密鑰是存在於$posted,其結果將是一個空數組,這將評估爲false

+0

謝謝你的回答。我很驚訝,我發現只要檢查所有必填字段的「if(empty())...」平均快50%左右。我認爲這會更快。 – JROB

+0

好吧,它有沒有函數調用的優點,如果你像我建議的那樣做,你實際上不需要查看所有的東西,只要找到一個缺失的東西就可以停止查找。 –

0
print_r(array_intersect($required, array_keys($posted))); 

簡單的解決方案:

if (count(array_intersect($required, array_keys($posted))) == count($required)) { 
return true; 
} else { 
return false; 
} 
+0

這將返回'$ required'中存在的'$ required'中的所有值。如果不存在,我基本上只需要返回'true'或者'false'。 – JROB

+0

如果count(array_intersect($ required,array_keys($ posted)))== count($ required)){return true;} else {return false;} @JROB –

+0

如果您匹配數組值可能會有不同的結果,並且數組數會動態變化。 –

相關問題