2012-06-08 81 views
3

我試圖在持有資源(人)的應用程序中進行高級搜索過濾器。我在1維多維數組中獲得了所有結果。應用程序的用戶可以搜索人員職位名稱,技能,工作領域和國家。PHP Array_intersect多維數組與密鑰數量未知

我已經完成了查找符合用戶標準的人員的部分。這些結果存儲在多維數組中。如果用戶是找人帶一個職位和特殊技能的返回值的特定資源是這樣的:

$realfilters = array(2) { 
["resourcesWithJobtitle"]=> array(6) { 
    [0]=> string(1) "1" 
    [1]=> string(2) "48" 
    [2]=> string(2) "88" 
} 
["resourcesWithSkill"]=> array(9) { 
    [0]=> string(1) "4" 
    [1]=> string(1) "8" 
    [2]=> string(1) "48" 
    [3]=> string(2) "50" 
} 

當用戶也尋找一個工作現場,這是添加到結果:

["resourcesWithWorkfield"]=> array(3) { 
    [0]=> string(2) "48" 
    [1]=> string(2) "96" 
    [2]=> string(2) "97" 
} 

我需要知道哪些資源滿足數組的所有維度,因此我可以顯示它們。 (所以在這個例子中,我需要一個只有1個值的數組:48)。我想我需要使用array_intersect,但似乎無法做到。

回答

3

可能的解決方法之一:您可能首先將extract()$realfilters數組的值賦給變量,然後將array_intersect()應用於它們。但是這種解決方案只適用於沒有多少可能的過濾器的情況。

另外一個可能是最好的解決辦法是在一個循環相交,是這樣的:

$res_arr = array_shift($realfilters); 
foreach($realfilters as $filter){ 
    $res_arr = array_intersect($res_arr, $filter); 
} 
+0

好像走的路,但不工作: [代碼] if(!empty($ realfilters)) { \t \t $ resourceIDsThatMatchAllCritera = $ realfilters [0]; \t爲($ I = 1; $ I <計數($ realfilters); $ I ++) \t { \t \t $ resourceIDsThatMatchAllCritera = array_intersect_key($ resourceIDsThatMatchAllCritera,$ realfilters [$ I]); \t} \t \t var_dump($ resourceIDsThatMatchAllCritera); //空\t } [/ code] –

+1

明白了。 $ realfilters [0]不起作用。將其更改爲$ realfilters [「resourcesWithJobtitle」],現在它可以工作! –

+0

是的。剛剛注意到,也是:) 但更好的解決方案剛剛出現在我的腦海(如果你不知道的關鍵): $ resourceIDsThatMatchAllCritera = array_shift($ realfilters); foreach($ realfilters as $ filter){ $ resourceIDsThatMatchAllCritera = array_intersect($ resourceIDsThatMatchAllCritera,$ filter); } –

0

只需循環遍歷主數組的頂部維度並與子數組相交。

3
$intersection = call_user_func_array('array_intersect', $array); 

這會給你目前在所有 $數組的子數組的元素。

編輯 - 這上面就像是寫一個快捷方式:

$intersection = array_intersect($array['a'], $array['b'], ...and so on for all elements...); 

環路可以作爲很好

$intersection = reset($array); 
foreach ($array as $subarr) { 
    $intersection = array_intersect($intersection, $subarr); 
} 
print_r($intersection);