복붙노트

PHP에서 다차원 배열에서 중복 값을 제거하는 방법

PHP

PHP에서 다차원 배열에서 중복 값을 제거하는 방법

PHP의 다차원 배열에서 중복 값을 제거하려면 어떻게해야합니까?

예제 배열 :

Array
(
    [0] => Array
    (
        [0] => abc
        [1] => def
    )

    [1] => Array
    (
        [0] => ghi
        [1] => jkl
    )

    [2] => Array
    (
        [0] => mno
        [1] => pql
    )

    [3] => Array
    (
        [0] => abc
        [1] => def
    )

    [4] => Array
    (
        [0] => ghi
        [1] => jkl
    )

    [5] => Array
    (
        [0] => mno
        [1] => pql
    )

)

해결법

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

    1.

    다른 방법이 있습니다. 중간 변수는 저장되지 않습니다.

    우리는 이것을 사용하여 다양한 중첩 쿼리의 결과를 중복 제거했습니다.

    $input = array_map("unserialize", array_unique(array_map("serialize", $input)));
    
  2. ==============================

    2.

    5.2.9부터 SORT_REGULAR 플래그를 다음과 같이 사용하면 array_unique ()를 사용할 수 있습니다 :

    array_unique($array, SORT_REGULAR);
    

    이렇게하면 함수가 $ a == $ b를 사용하는 것처럼 요소를 비교하여 동일한 결과를 얻을 수 있습니다.

    산출

    Array
    (
        [0] => Array
            (
                [0] => abc
                [1] => def
            )
    
        [1] => Array
            (
                [0] => ghi
                [1] => jkl
            )
    
        [2] => Array
            (
                [0] => mno
                [1] => pql
            )
    
    )
    

    그러나 설명서에는 다음과 같은 내용이 명시되어 있습니다.

  3. ==============================

    3.

    비슷한 문제가 있었지만 100 % 작동하는 해결책을 찾았습니다.

    <?php
        function super_unique($array,$key)
        {
           $temp_array = [];
           foreach ($array as &$v) {
               if (!isset($temp_array[$v[$key]]))
               $temp_array[$v[$key]] =& $v;
           }
           $array = array_values($temp_array);
           return $array;
    
        }
    
    
    $arr="";
    $arr[0]['id']=0;
    $arr[0]['titel']="ABC";
    $arr[1]['id']=1;
    $arr[1]['titel']="DEF";
    $arr[2]['id']=2;
    $arr[2]['titel']="ABC";
    $arr[3]['id']=3;
    $arr[3]['titel']="XYZ";
    
    echo "<pre>";
    print_r($arr);
    echo "unique*********************<br/>";
    print_r(super_unique($arr,'titel'));
    
    ?>
    
  4. ==============================

    4.

    또 다른 방법. 열쇠도 보존합니다.

    function array_unique_multidimensional($input)
    {
        $serialized = array_map('serialize', $input);
        $unique = array_unique($serialized);
        return array_intersect_key($input, $unique);
    }
    
  5. ==============================

    5.

    array_unique () 문서에 대한 사용자 의견에는 이에 대한 많은 해결책이 있습니다. 다음은 그 중 하나입니다.

    이것은 http://ca3.php.net/manual/en/function.array-unique.php#57202에서 발췌 한 것입니다.

  6. ==============================

    6.

    "중복 제거"가 "중복 제거는하지만 그 중 하나는 제거"를 의미하는 경우 솔루션은 먼저 "식별자 열"에 array_unique (...)를 적용한 다음 원래 배열에서 모든 키를 제거하는 것일 수 있습니다 열 배열에서 제거되었습니다.

    $array = [
        [
            'id' => '123',
            'foo' => 'aaa',
            'bar' => 'bbb'
        ],
        [
            'id' => '123',
            'foo' => 'ccc',
            'bar' => 'ddd'
        ],
        [
            'id' => '567',
            'foo' => 'eee',
            'bar' => 'fff'
        ]
    ];
    
    $ids = array_column($array, 'id');
    $ids = array_unique($ids);
    $array = array_filter($array, function ($key, $value) use ($ids) {
        return in_array($value, array_keys($ids));
    }, ARRAY_FILTER_USE_BOTH);
    

    결과는 다음과 같습니다.

    Array
    (
        [0] => Array
            (
                [id] => 123
                [foo] => aaa
                [bar] => bbb
            )
    
        [2] => Array
            (
                [id] => 567
                [foo] => eee
                [bar] => fff
            )
    
    )
    
  7. ==============================

    7.

    두 번째 매개 변수로 SORT_REGULAR 옵션을 사용하십시오.

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

    8.

    mysqli id와 같은 특정 키에서 중복을 제거해야하는 경우 여기에 간단한 funciton이있다.

    function search_array_compact($data,$key){
        $compact = [];
        foreach($data as $row){
            if(!in_array($row[$key],$compact)){
                $compact[] = $row;
            }
        }
        return $compact;
    }
    

    보너스 포인트 키의 배열을 전달하고 외부 foreach를 추가 할 수 있지만 추가 키당 2 배 더 느립니다.

  9. ==============================

    9.

    다음과 같은 배열을 가지고 있다면 :

    (users는 배열의 이름 임)

    Array=>
     [0] => (array)
       'user' => 'john'
       'age' => '23'
     [1] => (array)
      'user' => 'jane'
      'age' => '20'
     [2]=> (array)
      'user' => 'john'
      'age' => '23'
    

    중복을 삭제하려면 ... 다음을 수행하십시오.

    $serialized = array();
    for ($i=0; $i < sizeof($users); $i++) { 
      $test = in_array($users['user'], $serialized);
        if ($test == false) {
          $serialized[] = $users['user'];
        }
     }
    

    해결책이 될 수 있습니다 : P

  10. ==============================

    10.

    Array
    (
        [0] => Array
            (
                [id] => 1
                [name] => john
            )
    
        [1] => Array
            (
                [id] => 2
                [name] => smith
            )
    
        [2] => Array
            (
                [id] => 3
                [name] => john
            )
    
        [3] => Array
            (
                [id] => 4
                [name] => robert
            )
    
    )
    
    $temp = array_unique(array_column($array, 'name'));
    $unique_arr = array_intersect_key($array, $temp);
    

    그러면 배열에서 중복 된 이름이 제거됩니다. 열쇠로 유일한

  11. ==============================

    11.

    읽기 쉬운 솔루션, 아마도 가장 효율적인 것은 아닙니다 :

    function arrayUnique($myArray){
        if(!is_array($myArray))
            return $myArray;
    
        foreach ($myArray as &$myvalue){
            $myvalue=serialize($myvalue);
        }
    
        $myArray=array_unique($myArray);
    
        foreach ($myArray as &$myvalue){
            $myvalue=unserialize($myvalue);
        }
    
        return $myArray;
    
    } 
    
  12. ==============================

    12.

    다중 차원 배열을 고유하게 만드는 매우 쉽고 논리적 인 방법은 다음과 같습니다.

    다음과 같은 배열이 있다면 :

    Array
    (
        [Key1] => Array
            (
                [0] => Value1
                [1] => Value2
                [2] => Value1
                [3] => Value3
                [4] => Value1
            )
        [Key2] => Array
            (
                [0] => Value1
                [1] => Value2
                [2] => Value1
                [3] => Value3
                [4] => Value4
            )
    )
    

    foreach를 사용하여이 문제를 해결하십시오.

    foreach($array as $k=>$v){
        $unique=array_unique($v);
        $array[$k]=$unique;
    }
    

    그것은 당신에게 다음과 같은 결과를 줄 것이다 :

    Array
    (
        [Key1] => Array
            (
                [0] => Value1
                [1] => Value2
                [3] => Value3
            )
        [Key2] => Array
            (
                [0] => Value1
                [1] => Value2
                [3] => Value3
                [4] => Value4
            )
    )
    

    그리고 당신이 키의 순서를 재 배열하고자한다면,

    foreach($array as $k=>$v){
        $unique= array_values(array_unique($v));
        $array[$k]=$unique;
    }
    

    이 작업은 다음과 같이 정렬 된 키 값을 제공합니다.

    Array
    (
        [Key1] => Array
            (
                [0] => Value1
                [1] => Value2
                [2] => Value3
            )
        [Key2] => Array
            (
                [0] => Value1
                [1] => Value2
                [2] => Value3
                [3] => Value4
            )
    )
    

    이 모든 일이 끝나기를 바랍니다.

  13. ==============================

    13.

    직렬화하고 고유 한 대안

    $ 테스트 = [     [ 'abc', 'def'],     [ 'ghi', 'jkl'],     [ 'mno', 'pql'],     [ 'abc', 'def'],     [ 'ghi', 'jkl'],     [ 'mno', 'pql'], ]; $ result = array_reduce (     $ 테스트,     함수 ($ 캐리, $ 항목) {         if (! in_array ($ item, $ carry)) {             array_push ($ 캐리, $ 항목);         }         return $ carry;     },     [] ); var_dump ($ result); / *  PHP는 unique.php 배열 (3) {     [0] =>         배열 (2) {             [0] =>                 문자열 (3) "abc"             [1] =>                 문자열 (3) "def"         }     [1] =>         배열 (2) {             [0] =>                 문자열 (3) "ghi"             [1] =>                 문자열 (3) "jkl"         }     [2] =>         배열 (2) {               [0] =>                   string (3) "mno"               [1] =>                   문자열 (3) "pql"         } } * /

  14. ==============================

    14.

    이런 배열이 있다면

    data = array
    (
    [0] => array
    (
        [subject] => a
        [object] => c
    ),
    [1] => array
    (
        [subject] => b
        [object] => d
    ),
    [2] => array
    (
        [subject] => d
        [object] => b
    ),
    [3] => array
    (
        [subject] => d
        [object] => c
    ),
    [4] => array
    (
        [subject] => c
        [object] => a
    ),
    [5] => array
    (
        [subject] => c
        [object] => d
    )
    )
    

    다음과 같은 배열을 원한다.

    data = array
    (
    [0] => array
    (
        [subject] => a
        [object] => c
    ),
    [1] => array
    (
        [subject] => b
        [object] => d
    ),
    [2] => array
    (
        [subject] => d
        [object] => c
    )
    )
    

    또는

    data = array
    (
    [0] => array
    (
        [subject] => d
        [object] => b
    ),
    [1] => array
    (
        [subject] => c
        [object] => a
    ),
    [2] => array
    (
        [subject] => c
        [object] => d
    )
    )
    

    다음 코드가 도움이 될 수 있습니다.

        $data1 = array();
        $data1 = $data;
        for($q=0;$q<count($data);$q++)
        {
                for($p=0;$p<count($data1);$p++)
                {
                        if (($data[$q]["subject"] == $data1[$p]["object"]) && ($data[$q]["object"] == $data1[$p]["subject"]))
                        {
                                $data1[$p]["subject"] = $data[$q]["subject"];
                                $data1[$p]["object"] = $data[$q]["object"];
                        }
                }
        }
        $data1 = array_values(array_map("unserialize", array_unique(array_map("serialize", $data1))));
        $data = $data1;
    
  15. ==============================

    15.

    이 문제에 많은 생각을하고 최적의 솔루션은 두 가지 규칙을 따라야한다고 판단했습니다.

    이를 염두에두고 PHP의 모든 단점을 고려할 때, 내가 생각해 낸 해결책은 다음과 같다. 다른 답변 들과는 달리, 그것은 당신이 원하는 어떤 키 (들)을 기반으로 요소를 제거 할 수있는 능력을 가지고 있습니다. 입력 배열은 숫자 키로 예상됩니다.

    $count_array = count($input);
    for ($i = 0; $i < $count_array; $i++) {
        if (isset($input[$i])) {
            for ($j = $i+1; $j < $count_array; $j++) {
                if (isset($input[$j])) {
                    //this is where you do your comparison for dupes
                    if ($input[$i]['checksum'] == $input[$j]['checksum']) {
                        unset($input[$j]);
                    }
                }
            }
        }
    }
    

    단점은 반복이 완료 될 때 키가 순서대로 정렬되지 않는다는 것입니다. 후속 적으로 foreach 루프 만 사용하는 경우에는 문제가되지 않지만 for 루프를 사용해야하는 경우 $ input = array_values ​​($ input); 위의 키를 다시 번호 매기기.

  16. ==============================

    16.

    사람들이 array_unique ()가 매우 느린다고 말하면서 여기에 한 레벨의 다차원 배열에 사용하는 스 니펫이 있습니다.

    $serialized_array = array_map("serialize", $input);
    
    foreach ($serialized_array as $key => $val) {
         $result[$val] = true;
    }
    
    $output = array_map("unserialize", (array_keys($result)));
    

    첫 번째 사용자가 php.net의 array_unique () 함수 페이지를 참조했다.

  17. ==============================

    17.

    많은 사람이 나에게 고유 다차원 배열을 만드는 법을 물었습니다. 나는 당신의 의견에서 참고를 가지고 가고 저를 돕는다.

    우선, @ jeromegamez @ daveilers에게 감사드립니다. 그러나 내가 대답을 할 때마다, 그들은 어떻게이 '연재'와 '비 직렬화'가 작동 하는지를 물었다. 그래서 나는이 이유를 당신과 공유하여 더 많은 사람들이이 배경의 개념을 이해하는 데 도움이 될 것입니다.

    나는 왜 우리가 'serialize'하고 'unserialize'를 사용하는지 설명하고 있습니다.

    1 단계 : 다차원 배열을 1 차원 배열로 변환

    다차원 배열을 1 차원 배열로 변환하려면 먼저 배열 내부의 모든 요소 (중첩 배열 포함)의 바이트 스트림 표현을 생성합니다. serialize () 함수는 값의 바이트 스트림 표현을 생성 할 수 있습니다. 모든 요소의 바이트 스트림 표현을 생성하려면 array_map () 함수 내에서 serialize () 함수를 콜백 함수로 호출하십시오. 결과는 다차원 배열의 레벨 수에 관계없이 1 차원 배열이됩니다.

    2 단계 : 고유 한 값 만들기

    이 1 차원 배열을 고유하게 만들려면 array_unique () 함수를 사용하십시오.

    3 단계 : 다차원 배열로 되돌립니다.

    배열은 이제 고유하지만 값은 바이트 스트림 표현과 비슷합니다. 다시 다차원 배열로 되돌리려면 unserialize () 함수를 사용하십시오.

    $input = array_map("unserialize", array_unique(array_map("serialize", $input)));
    

    이 모든 것에 다시 한 번 감사드립니다.

  18. from https://stackoverflow.com/questions/307674/how-to-remove-duplicate-values-from-a-multi-dimensional-array-in-php by cc-by-sa and MIT lisence