2013-07-29 4 views
2

배열에서 모든 중복을 찾고 중복 값 키와 값으로 키가있는 새 배열을 만들려고합니다. 그 중복키에 중복 키와 값을 중복 배열로 만드는 배열에서 중복 값을 찾습니다.

예 키로

[1] => 10 
[2] => 11 
[3] => 12 
[4] => 12 
[5] => 12 
[6] => 13 
[7] => 13 

는 난 그냥

[4] => [3] // value of key 4 is dupe of key 3 
[5] => [3] // value of key 5 is dupe of key 3 
[7] => [6] // value of key 7 is dupe of key 6 

이 나를 모든 중복 키를 얻을 필요 중복 체크를 적용한 후,하지만 난 중복 필요 값으로 키는 키있는로

$arr_duplicates = array_keys(array_unique(array_diff_assoc($array, array_unique($array)))); 

감사

+0

뭐? 나는 100 만 가지가 필요합니까? – Neal

+0

@Neal 죄송합니다. 설명하려고 애쓰는 것을 설명하기가 어렵습니다. 기본적으로 방금 모든 배열을 배열로 가져올 필요가 있지만 새 배열의 값은 이들의 속임수가되어야합니다. – user2619159

+2

출력 형식을 편집 한 이유가 무엇입니까? 같은 키 ('3')로 두 요소를 가질 수 없습니다. –

답변

2

은 다른 솔루션을 통해 잠재적 인 속도 향상이보십시오. 그러나 큰 데이터 세트에서 더 많은 메모리를 사용하게 될 것입니다.

<?php 

$orig = array(
    1 => 10, 
    2 => 11, 
    3 => 12, 
    4 => 12, 
    5 => 12, 
    6 => 13, 
    7 => 13 
); 

$seen = array(); 
$dupes = array(); 

foreach ($orig as $k => $v) { 
    if (isset($seen[$v])) { 
     $dupes[$k] = $seen[$v]; 
    } else { 
     $seen[$v] = $k; 
    } 
} 
unset($seen); 

var_dump($dupes); 
+0

좋은 소식, 매우 빠른 – user2619159

1

이 당신이 원하는 것을해야 중복입니다. 배열을 반복하고 값이 이미 거기에 있는지 확인하십시오. 그렇다면 결과에 추가하십시오.

$arr_duplicates = array(); 
foreach($array as $k=>$v){ 
    // array_search returns the 1st location of the element 
    $first_index = array_search($v, $array); 
    // if our current index is past the "original" index, then it's a dupe 
    if($k != $first_index){ 
     $arr_duplicates[$k] = $first_index; 
    } 
} 

DEMO : http://ideone.com/Kj0dUV

+0

'$ k! $ first_index'를'$ k! = $ first_index'로 변경하면 다음과 같이 임의의 순서로 색인을 처리 할 수있다. '$ array = [7 => 13, 6 => 13]'. –

+0

@ 네이트 : 그렇게 생각하지 않았어, 고마워. –

+0

@RocketHazmat 이것은 위대한 함수입니다. 저는 foreach()도 시도 했었습니다. ive의 유일한 문제는 매우 큰 배열, 즉 10000 ++ 레코드로 작업하고 있으며 속도가 매우 중요하다는 것입니다. – user2619159

관련 문제