2010-08-08 4 views
0

나는 같은 길이의 두 배열을 가지고있다. ($search_type, $search_term). 동일한 유형 및 검색어 (즉, $search_type[$a] == $search_type[$b] && $search_term[$a] == $search_term[$b])를 가진 검색이라는 의미에서 중복을 제거하고 싶습니다.두 배열을 가진 array_unique

루프를 사용하여이 코드를 작성할 수 있다는 사실을 알고 있는데, 내장 함수를 사용하는 더 단순하지만 (똑같이 효율적인) 방법이 있는지 궁금한가요?

+0

당신이 두 개의 배열을 유지해야합니까 : 여기에 짧은 당신이 덜 예쁜 배열로 끝날 일이 아마도 더 효율적? –

+0

예를들 수 있습니까? –

+0

@Casey Hope : 아니요, 보존 할 필요가 없습니다 – babonk

답변

0

array_intersect() 두 배열을 취하여 배열 A의 값이 배열 B에있는 배열을 반환하거나 array_diff()을 반올림하고 B에없는 모든 값의 배열을 반환합니다.

0

좋아,이 두 배열을 결합하는 지나치게 복잡한 ad-hoc function foo() (오류 처리, 문서화 및 테스트가 없음)이 있습니다. array_unique()는 중복을 처리합니다.

<?php 
$search_term = array('termA', 'termB', 'foo'=>'termC', 'bar'=>'termD', 'termB', 'termA'); 
$search_type= array('typeA', 'typeB', 'foo'=>'typeC', 'bar'=>'typeD', 'typeB', 'typeA'); 

$x = foo(array('term', $search_term), array('type', $search_type)); 
$x = array_unique($x, SORT_REGULAR); 
var_dump($x); 

function foo() { 
    $rv = array(); 
    $params = func_get_args(); 
    foreach (array_keys($params[0][1]) as $key) { 
    $rv[$key] = array(); 
    foreach($params as $p) { 
     $rv[$key][$p[0]] = $p[1][$key]; 
    } 
    } 
    return $rv; 
} 

인쇄

array(4) { 
    [0]=> 
    array(2) { 
    ["term"]=> 
    string(5) "termA" 
    ["type"]=> 
    string(5) "typeA" 
    } 
    [1]=> 
    array(2) { 
    ["term"]=> 
    string(5) "termB" 
    ["type"]=> 
    string(5) "typeB" 
    } 
    ["foo"]=> 
    array(2) { 
    ["term"]=> 
    string(5) "termC" 
    ["type"]=> 
    string(5) "typeC" 
    } 
    ["bar"]=> 
    array(2) { 
    ["term"]=> 
    string(5) "termD" 
    ["type"]=> 
    string(5) "typeD" 
    } 
} 
+0

foo()가 내장 함수를 사용하여 더 짧은 방법으로 수행 될 수 있는지 알고 싶습니다. – babonk

+0

MultipleIterator 및 iterator_to_array()가 있습니다. 그러나 불행하게도 MultipleIterator :: key()는 foreach/iterator_to_array에서 "invalid key"오류를 일으키는 배열을 반환합니다. -/그렇지 않으면 함수가 조금 짧아집니다 (반복자가 대신 반환 할 때 요소의 순서에 의존합니다). 키 사용). 매개 변수 이름을 변경 하시겠습니까? 당신이해야 할 일은'name = "foo [0] [term]"... name = "foo [0] [type]"... foo [1] [term]과 같이 이름을 짓는 것입니다. .foo [1] [type]'. – VolkerK

0

단지 내장 함수를 사용하여 문제를 해결하는 간단한 방법이처럼은 보이지 않는다.

(적어도 논리적으로는) 작동해야합니다.

$search_terms = array('a', 'b', 'c', 'c', 'd', 'd'); 
$search_types = array(1, 2, 3, 4, 5, 5); 

$terms = array_fill_keys($search_terms, array()); 
// Loop through them once and make an array of types for each term 
foreach ($search_terms as $i => $term) 
    $terms[$term][] = $search_types[$i]; 

// Now we have $terms = array('a' => array(1), 
//       'b' => array(2), 
//       'c' => array(3, 4), 
//       'd' => array(5, 5) 
//      ); 

// Now run through the array again and get rid of duplicates. 
foreach ($terms as $i => $types) 
    $terms[$i] = array_unique($types); 

편집 :

$search_terms = array('a', 'b', 'c', 'c', 'd', 'd'); 
$search_types = array(1, 2, 3, 4, 5, 5); 

$terms = array_fill_keys($search_terms, array()); 
// Loop through them once and make an array of types for each term 
foreach ($search_terms as $i => $term) 
    $terms[$term][$search_types[$i]] = 1; 

// Now we have $terms = array('a' => array(1 => 1), 
//       'b' => array(2 => 1), 
//       'c' => array(3 => 1, 4 => 1), 
//       'd' => array(5 => 1) 
//      );