2010-11-25 3 views
0

100 개의 하위 배열이 포함 된 다차원 배열이 있다고 가정합니다. 하위 배열에는 항상 3 개 이상의 인덱스가 있지만 더 많은 인덱스가있을 수 있습니다. 큰 배열에서 다른 하위 배열을 제거하고 싶습니다. 은 세 개의 인덱스과 관련됩니다. 두 하위 배열을 갖는 배열 예 : 처음 3 개 인덱스가 4하지 않는 경우에도 일치하기 때문에 하위 배열의몇 가지 특정 인덱스와 관련하여 PHP 배열 중복 제거

array(array(0 => 'a', 1=> 'b', 2 => 'c', 3 => 'd'), array(0 => 'a', 1=> 'b', 2=> 'c', 3=> 'z')) 

하나가 제거 될 것입니다.

나는 가장 우아하고 효율적인 솔루션을 찾고 있습니다. FROM

+0

그럼 두 개가 제거되면 어느 쪽이 좋을까요? –

+0

은 중요하지 않습니다. – babonk

답변

1
/** 
* Create Unique Arrays using an md5 hash 
* 
* @param array $array 
* @return array 
*/ 
function arrayUnique($array, $preserveKeys = false) 
{ 
    $arrayRewrite = array(); 
    $arrayHashes = array(); 
    foreach($array as $key => $item) { 
     $hash = md5(serialize($item)); 
     if (!isset($arrayHashes[$hash])) { 
      $arrayHashes[$hash] = $hash; 
      if ($preserveKeys) { 
       $arrayRewrite[$key] = $item; 
      } else { 
       $arrayRewrite[] = $item; 
      } 
     } 
    } 
    return $arrayRewrite; 
} 

$uniqueArray = arrayUnique($array); 
var_dump($uniqueArray); 

: http://www.phpdevblog.net/2009/01/using-array-unique-with-multidimensional-arrays.html

제거 된 의견은 사이트를 방문하는 사람들에게 인센티브를 제공하는 - 나는 몇 가지 경우에 이것을 사용했습니다.

희망 하시겠습니까?

EDIT : 첫 번째 3 개의 색인을 일치시켜야한다는 점에서이 특별한 문제에 대한 해결책은 아니지만, 여전히 다차원 배열에서 array_unique()를 사용하는 일반적인 질문에 대한 아주 좋은 해결책입니다.

누군가가 여러분의 목적을 위해 부딪 치고 편집 할 수 있다면 더 좋습니다!

+0

K, 나 자신을 변경하십시오. 왜 PHP는 array_unique_custom (compare_callback, array)과 같은 함수를 가지고 있지 않는가? 다른 인덱스를 비교할 콜백을 제공 할 수 있습니까? – babonk

+0

이 예제는 몇 가지 방법으로 개선 될 수 있지만 큰 실수가 있습니다. 'md5' 호출로 인해이 함수가 두 가지 유형 및 값의 가능한 모든 순열을 미리 알지 못한다면이 함수가 올바르게 작동한다는 것을 보장 할 수 없습니다 키 및 항목을 하위 배열에 저장합니다. – Jon

1

Zenph는 90 %의 정확도를 얻었지만 처음 3 가지 요소 만 고유 한 것으로보고 싶었습니다. 직렬화 바로 전에 Zenph의 코드와 함께 아래 함수를 사용하여 처음 세 요소 만 봅니다.

function firstThree($array) 
{ 
    $retArray = array(); 
    array_push($retArray, $array[1], $array[2], $array[3]); 
    return $retArray; 
} 
0

트릭을 수행합니다. 정적 변수가있는 자유 함수로 인해 가장 우아한 예제는 아니지만 콜백 대상에 대해 람다 또는 클래스 인스턴스를 사용하여 좀 더 우아하게 만들 수 있습니다.

function filter($subArray) { 
    static $seenKeys = null; 
    if ($seenKeys === null) { 
     $seekKeys = array(); 
    } 

    // I 'm just selecting the "three first" indexes here, 
    // you can change it to better suit your needs 
    $thisKey = serialize(array_slice($subArray, 0, 3)); 
    if (isset($seenKeys[$thisKey])) { 
     return false; 
    } 
    else { 
     return $seenKeys[$thisKey] = true; 
    } 
} 

$result = array_filter($inputArray, 'filter'); 

나는 각 부분 배열의 처음 세 항목의 유형 및/또는 값에 대한 가정을하지 않고 PHP에 갈 수이 예제 빨리 생각합니다. 그러한 가정이 가능하다면, 최소한 serialize 호출은 더 적절한 것으로 대체 될 수 있습니다. 나는이 과정이 상당히 빨라질 것이라고 상상한다.