2013-03-12 1 views
1

내 마지막 question을 기준으로 다음 두 배열을 array_intersect()과 어떻게 비교할 수 있습니까? 첫 번째 배열의 값을 두 번째 배열의 내부 배열의 name 값과 비교하고 싶습니다.PHP : advanced array_intersect()

[1] => array('name' => 'banana', 'price' => 123), 

나의 현재 해결 방법은 내부 배열의 name와 2 차 배열을 복제하는 것입니다

// $arrayA 
[0] => 'apple', 
[1] => 'pineapple', 
[2] => 'orange', 
... 
[299,999] => 'banana' 

// $arrayB 
[0] => array('name' => 'bamboo', 'price' => 123), 
[1] => array('name' => 'banana', 'price' => 123), 
[2] => array('name' => 'boy', 'price' => 123), 
[3] => array('name' => 'ball', 'price' => 123), 
[4] => array('name' => 'balloon', 'price' => 123), 
[5] => array('name' => 'bazooka', 'price' => 123), 

내 예상 된 결과는 다음과 같은 결과를 포함, 배열에있을 것입니다 가치 만. 즉

$arrayB_clone = array(); 
foreach($arrayB as $inner_array) { 
    $arrayB_clone[] = $inner_array['name']; 
} 
$result_index = array_intersect($arrayB_clone, $arrayA); 
$result = array(); 
foreach($result_index as $idx => $v) { 
    $result[] = $arrayB[$idx]; // value $v is not important now 
} 
var_dump($result); 

하지만 내 배열> 30 만 개 레코드이기 때문에, 그것은 복제 할 때 메모리 & 자원을 많이 소모됩니다. 더 나은 해결책이 있습니까?

답변

3

$arrayA을 바꿔서 조회가 더 빨라야합니다. 그리고 단순히 B 반복과 일치하는 결과 추가 :

$mapA = array_flip($arrayA); 

$results = array(); 

foreach ($arrayB as $item) { 
    if (isset($mapA[$item['name']])) { 
     $results[] = $item; 
    } 
} 

또는 :

$results = array_filter($arrayB, function($item) use ($mapA) { 
    return isset($mapA[$item['name']]); 
});