programing

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

newsource 2022. 9. 21. 00:06

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 이후를 사용하면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
(
    [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);

그러면 중복된 이름이 배열에서 제거됩니다.키별 고유

제거'가 ' 제거'를의미할 경우, ' 제거'를 '복제 제거'로 .array_unique(...)column"에서한 후합니다.

$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_unique() 문서의 사용자 코멘트에는 이에 대한 많은 솔루션이 있습니다.그 중 하나를 다음에 나타냅니다.

dot comrbnsn kenrbnsn
12:092005 †7 인치 27 인치12:09

또 다른 어레이는 멀티 감압 어레이에 고유한 어레이입니다.이 테스트는 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 에서 온 것입니다.

mysqli ID와 같은 특정 키의 중복을 제거할 필요가 있는 경우, 여기 간단한 함수가 있습니다.

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

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

다음과 같은 어레이가 있는 경우:

(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

많은 분들이 유니크한 다차원 배열을 어떻게 만드냐고 물어보셨어요.당신의 코멘트를 참고해서 도움이 되었습니다.

먼저 @jeromegamez @daveiler 님의 솔루션에 감사드립니다.하지만 매번 답을 줄 때마다 '직렬화'와 '직렬화 해제'가 어떻게 작동하는지 물어봤어요.그래서 더 많은 사람들이 이 개념을 이해하는 데 도움이 될 수 있도록 그 이유를 여러분과 공유하고 싶습니다.

순서에서는, 「시리얼라이즈」와 「시리얼라이즈 해제」를 사용하는 이유를 설명합니다.

순서 1: 다차원 어레이를 1차원 어레이로 변환합니다.

다차원 배열을 1차원 배열로 변환하려면 먼저 배열 내의 모든 요소(네스트된 배열 포함)의 바이트 스트림 표현을 생성합니다.serialize() 함수는 값의 바이트 스트림 표현을 생성할 수 있습니다.모든 요소의 바이트 스트림 표현을 생성하려면 array_map() 내의 call serialize() 함수를 콜백 함수로 사용합니다.그 결과 다차원 배열의 레벨 수에 관계없이 1차원 배열이 됩니다.

2단계: 값을 고유하게 하다

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

순서 3: 다차원 배열로 되돌리기

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

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

다시 한 번 감사드립니다.

다차원 어레이를 고유하게 만드는 매우 쉽고 논리적인 방법은 다음과 같습니다.

다음과 같은 어레이가 있는 경우:

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

이것으로 모든 것이 해결되기를 바랍니다.

읽기 쉬운 솔루션, 아마 가장 효율적이지 않을 것입니다.

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;

} 

들 말하는 array_unique()우우느느느느다다여기에서는 1레벨의 다차원 어레이에 사용하는 스니펫을 보여드릴게요

$serialized_array = array_map("serialize", $input);

foreach ($serialized_array as $key => $val) {
     $result[$val] = true;
}

$output = array_map("unserialize", (array_keys($result)));

입니다.array_unique() php.net의

시리얼라이즈 및 유니크한 대체 수단

$test = [
    ['abc','def'],
    ['ghi','jkl'],
    ['mno','pql'],
    ['abc','def'],
    ['ghi','jkl'],
    ['mno','pql'],
];

$result = array_reduce(
    $test,
    function($carry,$item){
        if(!in_array($item,$carry)) {
            array_push($carry,$item);
        }
        return $carry;
    },
    []
);

var_dump($result);

/*
 php unique.php
array(3) {
    [0] =>
        array(2) {
            [0] =>
                string(3) "abc"
            [1] =>
                string(3) "def"
        }
    [1] =>
        array(2) {
            [0] =>
                string(3) "ghi"
            [1] =>
                string(3) "jkl"
        }
    [2] =>
        array(2) {
              [0] =>
                  string(3) "mno"
              [1] =>
                  string(3) "pql"
        }
}

*/

나는 이 문제에 대해 많은 생각을 했고 최적의 해결책은 두 가지 규칙을 따라야 한다고 결정했다.

  1. 확장성을 확보하기 위해 어레이를 새로운 어레이로 복사하지 않고 그대로 변경
  2. 퍼포먼스를 위해 각 비교는 1회만 실시합니다.

그것을 염두에 두고, 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]);
                }
            }
        }
    }
}

유일한 단점은 반복이 완료되었을 때 키가 순서대로 되어 있지 않다는 것입니다.루프만 에는 문제가 되지 , 에는 포어치 루프를 할 수 있습니다.$input = array_values($input);는 키 번호를 변경한다에 위의 후.

non-restricted 길이에(n)차원 배열에 대해 이 해결책은 해 보세요.
예를 들어 이 배열

$arr= [
0 => [0=>"a" , 1=>"b" ,  2=>"c" ] ,
1 => [0=>"x" , 1=>"b" , 2=>"a", 3=>"p"],
2=>   [
       [ 
          0=>"y" ,
          1=>"b" ,
          2=> [0=>"x" , 1=>"m" , 2=>"a"]
       ],
       1=>"z" ,
       2=>"v"
       ]
     ];

이것은 해결책이다.

$ar2=[];
$ar3=[];
function test($arr){
    
    global $ar2,$ar3;
    if(is_array($arr)){
       return array_map("test",$arr);
    }
    if(!isset($ar2[$arr])){
        $ar2[$arr]=1;
        $ar3[]=$arr;
    }
}
array_map("test",$arr);
print_r($ar3);

그 대답에 기초한 정답으로, 제 대답은 추가했다.작은 코드만 indices-를 재설정하는 것이라고 덧붙였다.

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

언급URL:https://stackoverflow.com/questions/307674/how-to-remove-duplicate-values-from-a-multi-dimensional-array-in-php