복붙노트

PHP는 다차원 배열 중복 제거

PHP

PHP는 다차원 배열 중복 제거

이 질문이 제거가 필요한 복제본인지 확실하지 않지만 다른 곳에서 답을 찾을 수 없으므로 요청할 것입니다.

나는 다음과 같은 2 차원 배열을 가지고있다.

Array
(
[0] => Array
    (
        [0] => dave
        [1] => jones
        [2] => c@b.c
    )

[1] => Array
    (
        [0] => john
        [1] => jones
        [2] => a@b.c

    )

[2] => Array
    (
        [0] => bruce
        [1] => finkle
        [2] => c@b.c
    )
)

중복 된 이메일을 삭제하고 싶습니다. 위의 예에서 [] [0] 또는 [] [2] 중 하나만 제거하고 싶습니다. 나는 이름과 같은 것을 검사하는 것에 대해 걱정할 필요가 없다. 단지 서브 어레이가 단일 값에 기반하여 중복 제거 될 필요가있다.

지금 나는 이런 것을 가지고있다.

  if(is_array($array) && count($array)>0){
  foreach ($array as $subarray) {
    $duplicateEmail[$subarray[2]] = isset($duplicateEmail[$subarray[2]]);
    unset($duplicateEmail[$subarray[2]]);
   }
  }

그러나 그것은 옳지 않습니다. 어떤 도움을 주셔서 감사합니다.

해결법

  1. ==============================

    1.배열 인덱스의 고유성을 사용하는 빠른 솔루션 :

    배열 인덱스의 고유성을 사용하는 빠른 솔루션 :

    $newArr = array();
    foreach ($array as $val) {
        $newArr[$val[2]] = $val;    
    }
    $array = array_values($newArr);
    

    알림 1 : 위에서 볼 수 있듯이 전자 메일 주소의 마지막 일치 항목이 첫 번째 항목 대신 사용됩니다. 두 번째 줄을 다음과 같이 바꿀 수 있습니다.

    foreach (array_reverse($array) as $val) {
    

    알림 2 : 결과 배열의 인덱스가 다소 섞여 있습니다. 하지만 이건 상관 없어요.

  2. ==============================

    2.훨씬 간단한 솔루션.

    훨씬 간단한 솔루션.

    $unique = array_map('unserialize', array_unique(array_map('serialize', $array)));
    
    echo "<pre>";
    print_r($unique);
    
  3. ==============================

    3.array_unique ()에 대한 사용자 의견에는 이에 대한 몇 가지 해결책이 있습니다. 예를 들어

    array_unique ()에 대한 사용자 의견에는 이에 대한 몇 가지 해결책이 있습니다. 예를 들어

    http://uk.php.net/manual/en/function.array-unique.php#57202.

  4. ==============================

    4.

    $array = array(
        array('dave','jones','c@b.c'),
        array('dave','jones','a@c.d'),
        array('dave','jones','c@b.c'),
        array('dave','jones','e@v.d'),
        array('dave','jones','a@c.d')   
    );
    
    $copy = $array; // create copy to delete dups from
    $usedEmails = array(); // used emails
    
    for( $i=0; $i<count($array); $i++ ) {
    
        if ( in_array( $array[$i][2], $usedEmails ) ) {
            unset($copy[$i]);
        }
        else {
            $usedEmails[] = $array[$i][2];
        }
    
    }
    
    print_r($copy);
    
  5. ==============================

    5.나의 제안 :

    나의 제안 :

    protected function arrayUnique($array, $preserveKeys = false)
    {
        $uniqueArray = array();
        $hashes = array();
    
        foreach ($array as $key => $value) {
            if (true === is_array($value)) {
                $uniqueArray[$key] = $this->arrayUnique($value, $preserveKeys);
    
            } else {
                $hash = md5($value);
    
                if (false === isset($hashes[$hash])) {
                    if ($preserveKeys) {
                        $uniqueArray[$key] = $value;
                    } else {
                        $uniqueArray[] = $value;
                    }
    
                    $hashes[$hash] = $hash;
                }
            }
        }
    
        return $uniqueArray;
    }
    
  6. ==============================

    6.사용자 SORT_REGULAR가 두 번째 매개 변수입니다.

    사용자 SORT_REGULAR가 두 번째 매개 변수입니다.

    $uniqueArray = array_unique($array, SORT_REGULAR);
    
  7. ==============================

    7.두 번째 매개 변수로 null을 사용하여 array_column ()의 영리한 키 할당 기능을 사용할 수 있습니다. 하위 배열 데이터를 완전히 그대로 유지하면서 각 하위 배열에 새 키를 할당합니다. 이러한 임시 키 (요소 [2] 일명 "전자 메일 값")는 효과적으로 중복 된 전자 메일로 새 하위 배열을 덮어 쓰게됩니다. 중복이 제거되면 array_values ​​()를 사용하여 (필요한 경우) 배열의 인덱스를 다시 만듭니다.

    두 번째 매개 변수로 null을 사용하여 array_column ()의 영리한 키 할당 기능을 사용할 수 있습니다. 하위 배열 데이터를 완전히 그대로 유지하면서 각 하위 배열에 새 키를 할당합니다. 이러한 임시 키 (요소 [2] 일명 "전자 메일 값")는 효과적으로 중복 된 전자 메일로 새 하위 배열을 덮어 쓰게됩니다. 중복이 제거되면 array_values ​​()를 사용하여 (필요한 경우) 배열의 인덱스를 다시 만듭니다.

    이에 : (하지만)

    $array = [
        ['dave', 'jones', 'c@b.c'],
        ['john', 'jones', 'a@b.c'],
        ['bruce', 'finkle', 'c@b.c']
    ];
    
    var_export(array_values(array_column($array, null, 2)));
    

    산출:

    array (
      0 => 
      array (
        0 => 'bruce',
        1 => 'finkle',
        2 => 'c@b.c',
      ),
      1 => 
      array (
        0 => 'john',
        1 => 'jones',
        2 => 'a@b.c',
      ),
    )
    
  8. from https://stackoverflow.com/questions/1861682/php-multi-dimensional-array-remove-duplicate by cc-by-sa and MIT license