2013-06-01 2 views
1

나는 3 개의 배열과 각각의 배열을 포함하는 다차원 배열을 가지고 있습니다. 여기처럼 보이는 것입니다 : 내가하고 싶은 무엇PHP 다차원 배열 내의 배열 사이의 교차점 결정

$data = array(
    'first' => array(1,2,3,4,5,6), 
    'second' => array(1,2,3), 
    'third' => array(1,2,5,6) 
); 

이 세 가지에 교차로를 실행하고 배열의 결과로 끝날되고,이 예에서, 것 array(1,2)

방법 나는 이것을 성취합니까?

답변

2
$newArray = array_values(call_user_func_array("array_intersect", $data)); 

array_intersect는 전달 된 모든 배열의 동일한 값을 반환합니다, 그래서 당신은 그것을 인수로 $data의 항목을 전달할 수 있습니다. array_values은 키가 변경되지 않으므로 다시 인덱싱하는 데 필요합니다 (필요하지 않지만 결과 배열을 for 루프로 사용할 때 유용함).

2

array_reducearray_intersect을 사용한다.

$v = array_values($data); 
$r = array_slice($v, 1); 
$result = array_reduce($r, 'array_intersect', $v[0]); 
var_dump($result); 

여기는 한 줄짜리예요. BTW

$comp = null; 
foreach ($data as $arr) { 
    if ($comp === null) { 
    $comp = $arr; 
    continue; 
    } else { 
    $comp = array_intersect($comp, $arr); 
    } 
} 
//$comp no contains all the unique values; 

: 다음 방법에 대한

array_reduce(array_slice($data, 0, -1), 'array_intersect', end($data)); 
+0

멋진 솔루션 .. – vascowhite

+0

@raina 여기 있습니다. 한 줄짜리 덧붙여서 –

+0

나는 그것을 보았다, ok.) 내가 아직 보지 못한 것은'call_user_func_array'를 사용하는 것보다 이것이 더 나은 방법이다. – raina77ow

0

무슨 일이 $ null로 데이터를 제외하고 $ 데이터의 개수 = 작동

0

이 문제를 해결하는 가장 간단한 방법은 array_reduce 함께 :

function process($result, $item) { 
    return is_null($result) ? $item : array_intersect($result, $item); 
} 
$result = array_reduce($data, 'process'); 

또는

과 같은 익명의 함수로 array_reduce를 사용하십시오.
$result = array_reduce($data, function($result, $item) { 
    return is_null($result) ? $item : array_intersect($result, $item); 
}); 

이 마지막 솔루션은 함수 이름을 포함하는 문자열을 사용하여 함수 (내장 또는 기타)를 참조 할 필요가 없다는 이점이 있습니다.