2011-05-02 80 views
1

我在php上有一個$數組,我想知道這些值是否來自特定的字典。例如,如果我的字典是值['貓','狗','汽車','人']的數組,我想過濾我的$數組,並返回false,如果一個單詞到這個不在字典上。從字典中過濾數組值

所以,如果$數組是:

['men', 'cat'] // return false; 
['man', 'cat'] // return true; 
['cat', 'dogs'] // return false; 
[''] // return false; 

等等...

如何過濾這樣的陣列?

+0

你肯定你的榜樣是正確的? – alex 2011-05-02 12:17:01

+0

呃...是嗎?爲什麼它應該是錯的? – kwichz 2011-05-02 12:22:33

回答

1
function checkDictionary($array,$dictionary){ 
    foreach($array as $array_item){ 
    if(!in_array($array_item,$dictionary)){ 
     return false; 
    } 
    } 
return true; 
} 

你也可以這樣做:

function checkDictionary($array,$dictionary){ 
$result = (empty(array_diff($array,$dictionary))) ? true : false; 
return $result; 
} 
+0

請注意,第一個示例類似於「O(n * m)」,因爲您可能會遍歷字典中的所有單詞以查找所有單詞。我想'array_diff'是更優化的(不知何故)... – 2011-05-02 12:29:08

+1

注意第二個例子 - 你不能在函數返回時使用'empty',你必須先將它分配給變量。 – 2011-05-02 12:30:17

+0

ups不知道我會糾正它。 – Headshota 2011-05-02 12:31:34

1
function doValuesExist($dictionary, $array) { 
    return (count(array_intersect($dictionary,$array)) == count($array)); 
} 
1

爲了提高性能,則應將你「字典」關聯數組,其中的鍵在字典中的字:

$dict = array_flip($dict); 

然後,您只需循環搜索的值即O(n)

function contains($search, $dict) { 
    foreach($search as $word) { 
     if(!array_key_exists($word, $dict)) { 
      return false; 
     } 
    return true; 
} 

參考:array_fliparray_key_exists