2012-06-08 4 views
3

리소스 (사람)를 보유하고있는 응용 프로그램에서 고급 검색 필터를 만들려고합니다. 모든 다차원 배열에서 결과를 얻었습니다. 응용 프로그램 사용자는 직위, 기술, 작업 필드 및 국가를 검색 할 수 있습니다.알 수없는 키 수를 가진 다차원 배열의 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" 
} 

표시 할 수 있도록 배열의 모든 크기를 충족시키는 리소스를 알아야합니다. (이 예제에서는 단지 하나의 값을 가진 배열이 필요합니다 : 48). 나는 array_intersect을 사용할 필요가 있다고 생각하지만 제대로 이해하지 못하는 것 같습니다.

답변

3

가능한 해결책 중 하나 : 변수에 대한 배열 값을 먼저 extract()으로 변경 한 다음 array_intersect()을 적용 할 수 있습니다. 그러나이 솔루션은 가능한 많은 필터가없는 경우에만 적용 할 수 있습니다. 당신에게 모든 $ 배열의 하위 배열에 존재하는 요소를 줄 것이다

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

사용 이동하는 방법처럼 보이지만 작동하지 않습니다 수

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

: [ 코드] if (! empty ($ realfilters)) { \t \t $ resourceIDsThatMatchAllCritera = $ realfilters [0]; 위한 \t ($ I = 1; $ i)는 카운트 ($ realfilters를 <; $ 난 ++) { \t \t \t $ resourceIDsThatMatchAllCritera = array_intersect_key ($ resourceIDsThatMatchAllCritera, $ realfilters [$ I를]); \t} \t \t var_dump ($ resourceIDsThatMatchAllCritera); // empty \t } [/ code] –

+1

알았습니다. $ realfilters [0]이 작동하지 않습니다. $ realfilters [ "resourcesWithJobtitle"]로 변경하고 이제는 작동합니다! –

+0

예.그냥 또한 그 것으로 나타났습니다 :) 더 나은 솔루션은 내 마음에 왔어요 (당신이 키를 모르면) : $ resourceIDsThatMatchAllCritera = array_shift ($ realfilters); foreach ($ realfilters를 $ filter로 사용) { $ resourceIDsThatMatchAllCritera = array_intersect ($ resourceIDsThatMatchAllCritera, $ filter); } –

0

메인 어레이의 상단 치수를 반복하여 서브 어레이와 교차합니다.

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

:

또 다른 하나는 아마도 가장 좋은 방법은, 루프에서 같은 교차하는 것입니다.

편집 - 이 위 기록에 대한 바로 가기 같습니다 : 루프뿐만 아니라

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