[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
    )

)



답변

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

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

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


답변

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

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
        )

)

그러나 설명서 에는 다음 사항이 명시되어 있습니다.

array_unique() 다차원 배열에서는 작동하지 않습니다.


답변

비슷한 문제가 있었지만 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'));

?>


답변

또 다른 방법. 키도 보존합니다.

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


답변

array_unique () 문서 에 대한 사용자 의견에는 이에 대한 많은 솔루션이 있습니다. 다음 중 하나입니다.

rbnsn 닷컴에서 kenrbnsn
2005 년 9 월 27 일 12시 9 분

다중 부담 배열을위한 또 다른 Array_Unique. 나는 이것을 2 차원 배열에서만 테스트했지만 더 일반화하거나 재귀를 사용하도록 만들 수 있습니다.

이 함수는 serialize, array_unique 및 unserialize 함수를 사용하여 작업을 수행합니다.


function multi_unique($array) {
    foreach ($array as $k=>$na)
        $new[$k] = serialize($na);
    $uniq = array_unique($new);
    foreach($uniq as $k=>$ser)
        $new1[$k] = unserialize($ser);
    return ($new1);
}

http://ca3.php.net/manual/en/function.array-unique.php#57202 에서 가져온 것 입니다.


답변

“중복 제거”가 “중복 제거, 그러나 복제”를 의미하는 경우 해결책은 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
        )

)


답변

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);

그러면 배열에서 중복 이름이 제거됩니다. 키로 독특한