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


답변:


251

array_unique () 사용하십시오 .

예:

$array = array(1, 2, 2, 3);
$array = array_unique($array); // Array is now (1, 2, 3)

20
@Ian -Note that array_unique() is not intended to work on multi dimensional arrays.
피터 Ajtai

18
위의 요소 키를 유지합니다. 다시 색인을 생성하려면 array_values를 적용하십시오. php.net/manual/en/function.array-values.php
CodeVirtuoso

3
이것은 나를 위해 친절하게 작동하지 $array = array_unique($array, SORT_REGULAR);
않았다

@PeterAjtai : 의견 섹션에서 강조해 주셔서 감사합니다. 시간이 많이 절약되었습니다.
Nana Partykar

29

사용하다 array_values(array_unique($array));

array_unique: 고유 배열의 경우 array_values: 재색 인화


1
+1 array_unique은 키와 값 쌍을 가진 객체를 반환하고 array_values값만 배열로 반환합니다.
narainsagar

24
//Find duplicates 

$arr = array( 
    'unique', 
    'duplicate', 
    'distinct', 
    'justone', 
    'three3', 
    'duplicate', 
    'three3', 
    'three3', 
    'onlyone' 
);

$unique = array_unique($arr); 
$dupes = array_diff_key( $arr, $unique ); 
    // array( 5=>'duplicate', 6=>'three3' 7=>'three3' )

// count duplicates

array_count_values($dupes); // array( 'duplicate'=>1, 'three3'=>2 )

9

나를 위해 일한 유일한 것은 :

$array = array_unique($array, SORT_REGULAR);

편집 : SORT_REGULAR원래 배열과 동일한 순서를 유지합니다.


8
$result = array();
foreach ($array as $key => $value){
  if(!in_array($value, $result))
    $result[$key]=$value;
}

5

독특array_unique() 하고 복제 된 아이템 을 원한다면 때로는 길이 아닙니다 ...

$unique=array("","A1","","A2","","A1","");
$duplicated=array();

foreach($unique as $k=>$v) {

if( ($kt=array_search($v,$unique))!==false and $k!=$kt )
 { unset($unique[$kt]);  $duplicated[]=$v; }

}

sort($unique); // optional
sort($duplicated); // optional

에 대한 결과

array ( 0 => '', 1 => 'A1', 2 => 'A2', ) /* $unique */

array ( 0 => '', 1 => '', 2 => '', 3 => 'A1', ) /* $duplicated */

3

이러한 마지막 값을 사용하기 위해 이러한 유형의 배열을 만들 수 있습니다.이 마지막 값은 열 또는 키 값으로 업데이트되고 배열에서 고유 한 값을 얻습니다 ...

$array = array (1,3,4,2,1,7,4,9,7,5,9);
    $data=array();
    foreach($array as $value ){

        $data[$value]= $value;

    }

    array_keys($data);
    OR
    array_values($data);

2

explode(",", implode(",", array_unique(explode(",", $YOUR_ARRAY))));

이것은 키 연결을 처리하고 결과 새 배열의 키를 직렬화합니다 :-)


1
explode("," $YOUR_ARRAY)언제 효과 $YOUR_ARRAYarray("1", "2", "3")있습니까?
kiamlaluno

@kiamlaluno-:) 그리고 대답은 다음과 같습니다. 경고 : explode ()는 매개 변수 2가 문자열, ... ... 행에 주어진 배열 일 것으로 예상합니다.
Jesse Chisholm

@JesseChisholm 네, 이것이 요점이지만, 아무도 코드를 알아 차리지 못했습니다.
kiamlaluno

2

배열의 크기에 따라

$array = array_values( array_flip( array_flip( $array ) ) );

array_unique보다 빠를 수 있습니다.


여기서 무슨 일이 일어나고 있는지에 대한 더 많은 정보는 더 크거나 작은 배열로 더 빠를 것입니다.
Fi Horan

키가 두 번 존재할 수 없기 때문에 이중 플립은 중복 값을 제거합니다. 그렇지 않으면 덮어 씁니다. 값이 복제되고 배열이 뒤집어지면 마지막 발생 (내가 가정)이 키의 값이됩니다.
Goldentoa11

PHP 7에서 다차원 배열을 두 번 이상 뒤집 으면 배열 요소가 예기치 않게 재정렬 될 수 있습니다.
Josh Habdas

1

그렇게하는 좋은 방법입니다. 출력이 다시 배열로 돌아가는지 확인하고 싶을 수도 있습니다. 이제는 마지막 고유 값만 표시합니다.

이 시도:

$arrDuplicate = array ("","",1,3,"",5);

foreach (array_unique($arrDuplicate) as $v){
  if($v != "") { $arrRemoved[] = $v; }
}
print_r ($arrRemoved);

1
    if (@!in_array($classified->category,$arr)){        
                                    $arr[] = $classified->category;
                                 ?>

            <?php } endwhile; wp_reset_query(); ?>

배열에서 처음으로 값을 확인하고 동일한 값을 찾았습니다. 무시하십시오.


1

PHP의 연관 배열에서 중복 값을 제거하십시오.

$arrDup = Array ('0' => 'aaa-aaa' , 'SKU' => 'aaa-aaa' , '1' => '12/1/1' , 'date' => '12/1/1' , '2' => '1.15' , 'cost' => '1.15' );

foreach($arrDup as $k =>  $v){
  if(!( isset ($hold[$v])))
      $hold[$v]=1;
  else
      unset($arrDup[$k]);
}

배열 ([0] => aaa-aaa [1] => 12/1/1 [2] => 1.15)


1

이를 수행하는 여러 가지 방법이있을 수 있습니다.

//first method
$filter = array_map("unserialize", array_unique(array_map("serialize", $arr)));

//second method
$array = array_unique($arr, SORT_REGULAR);

1

성능에 관심이 있고 간단한 배열이있는 경우 다음을 사용하십시오.

array_keys(array_flip($array));

array_unique보다 몇 배 빠릅니다.


1
$a = array(1, 2, 3, 4); 
$b = array(1, 6, 5, 2, 9); 
$c = array_merge($a, $b);
$unique = array_keys(array_flip($c));
print_r($unique);

이를위한 가장 빠른 방법은 PHP에 내장 된 array_flip 함수를 사용하는 것입니다 [1]. array_flip은 배열 값을 해당 키로 바꾸고 배열에 중복 키를 가질 수 없으므로 원래 배열의 값에 해당하는 고유 키 세트가 생깁니다. 이러한 키를 값으로 검색하려면 array_keys 함수를 사용하여 고유 한 값을 검색 할 수 있습니다. array_flip과 array_keys는 최악의 경우 O (n) 함수이지만 array_unique는 최악의 경우 O (n log (n))입니다. [2]
pawan kumar

1
답변에 대한 설명을 추가하십시오 (주석 섹션이 아님). 주어진 코드는 단일 배열 에서 중복 값을 어떻게 제거 합니까? 왜 두 개의 배열이 필요합니까?
Nico Haase

StackOverflow에 오신 것을 환영합니다! 답변의 의견에 설명을 추가 한 것으로 확인되었으므로이 정보를 답변 자체의 일부로 추가하면 도움이됩니다.
n4m31ess_c0d3r

이미 존재하는 답변 ( stackoverflow.com/a/52591730/2109067 )에 대한 편집으로 해당 의견을 추가하는 것이 더 합리적 입니다.
ankhzet

중복 요소가있는 단일 배열을 사용할 수 있습니다. 두 배열에서 하나의 값을 가져 와서 중복을 제거하는 데 문제가있었습니다.
pawan kumar

0
$arrDuplicate = array ("","",1,3,"",5);
 foreach(array_unique($arrDuplicate) as $v){
  if($v != "" ){$arrRemoved = $v;  }}
print_r($arrRemoved);

1
이것은 실제로 아무 것도 설명하지 않으며, "똑똑한"것처럼 보이지 않습니다.
Sven

자신의 게시물을 수정하여 이유를 설명 할 수 있습니다. 답변 끝에있는 "수정"링크를 클릭하십시오. : 나는 또한 당신이 자주 묻는 질문에 대한보고가 제안 stackoverflow.com/faq
ForceMagic

0
function arrayUnique($myArray)
{
    $newArray = Array();
    if (is_array($myArray))
    {
        foreach($myArray as $key=>$val)
        {
            if (is_array($val))
            {
                $val2 = arrayUnique($val);
            }
            else
            {
                $val2 = $val;
                $newArray=array_unique($myArray);
                $newArray=deleteEmpty($newArray);
                break;
            }
            if (!empty($val2))
            {
                $newArray[$key] = $val2;
            }
        }
    }
    return ($newArray);
}

function deleteEmpty($myArray)
{
    $retArray= Array();
    foreach($myArray as $key=>$val)
    {
        if (($key<>"") && ($val<>""))
        {
            $retArray[$key] = $val;
        }
    }
    return $retArray;
}

0

이 짧고 달콤한 코드를 사용해보십시오-

$array = array (1,4,2,1,7,4,9,7,5,9);
$unique = array();

foreach($array as $v){
  isset($k[$v]) || ($k[$v]=1) && $unique[] = $v;
  }

var_dump($unique);

출력-

array(6) {
  [0]=>
  int(1)
  [1]=>
  int(4)
  [2]=>
  int(2)
  [3]=>
  int(7)
  [4]=>
  int(9)
  [5]=>
  int(5)
}

1
이와 같은 제어 흐름에 부울 연산자를 남용하는 것은 불필요하게 혼동됩니다. 그냥 사용하십시오 if.
Mark Amery

0
<?php
$arr1 = [1,1,2,3,4,5,6,3,1,3,5,3,20];    
print_r(arr_unique($arr1));


function arr_unique($arr) {
  sort($arr);
  $curr = $arr[0];
  $uni_arr[] = $arr[0];
  for($i=0; $i<count($arr);$i++){
      if($curr != $arr[$i]) {
        $uni_arr[] = $arr[$i];
        $curr = $arr[$i];
      }
  }
  return $uni_arr;
}

루프에 count ($ arr)를 넣는 것은 매우 느리다
Kiruahxh

0

여기에 두 번째 빈 배열을 만들고 for첫 번째 배열에 루프를 사용하여 중복을 사용했습니다. 첫 번째 배열의 수만큼 많은 시간이 실행됩니다. 그런 다음 첫 번째 배열이있는 배열의 위치와 비교하고을 사용 하여이 항목이 이미 있는지 여부를 일치 in_array시킵니다. 그렇지 않으면를 사용하여 해당 항목을 두 번째 배열에 추가합니다 array_push.

$a = array(1,2,3,1,3,4,5);
$count = count($a);
$b = [];
for($i=0; $i<$count; $i++){
    if(!in_array($a[$i], $b)){
        array_push($b, $a[$i]);
    }
}
print_r ($b);

해당 코드에 대한 설명을 공유 할 수 있습니까? 예를 들어, 왜 foreach루프 를 사용하지 않습니까?
Nico Haase

이것은 일종의 형태이며 foreachfor 루프에 익숙 하기 때문에 사용하지 않은 이유 입니다. 그게 다야.
Aladin Banwal

그럼에도 불구하고 몇 가지 설명을 코드와 공유해야합니다. SO에 같은 답변을 게시하는 것은 좋은 스타일되지 않습니다 : 같은 문제를 가진 사람들은 영업 이익은 따라 올 수로, 그들은 당신의 코드들이 그것으로부터 배우고 자신의 요구에 채택 할 수 있도록 문제를 해결하는 방법을 이해 할 수 있어야한다
Nico Haase

0

함수를 통해 수행 할 수 있습니다. 세 개의 함수 복제를 수행하면 배열에 복제 된 값이 반환됩니다.

두 번째 함수 단일은 단일 평균 값이 배열에서 반복되지 않는 값만 반환하고 세 번째 및 전체 함수는 모든 값을 반환하지만 값이 중복되면 복제되지 않는 값을 단일로 변환합니다.

function duplicate($arr) {
    $duplicate;
    $count = array_count_values($arr);
    foreach($arr as $key => $value) {
        if ($count[$value] > 1) {
            $duplicate[$value] = $value;
        }
    }
    return $duplicate;
}
function single($arr) {
    $single;
    $count = array_count_values($arr);
    foreach($arr as $key => $value) {
        if ($count[$value] == 1) {
            $single[$value] = $value;
        }
    }
    return $single;
}
function full($arr, $arry) {
    $full = $arr + $arry;
    sort($full);
    return $full;
}

0
$array = array("a" => "moon", "star", "b" => "moon", "star", "sky");

// Deleting the duplicate items
$result = array_unique($array);
print_r($result);

심판 : 데모


1
정확히이 질문에 대한 원래의 답변으로부터 11 년 후에 array_unique로이 질문에 대답하는 요점은 무엇입니까?
Dylan Kas

0

array_unique () 함수의 대안 ..

무차별 대입 알고리즘 사용

// [1] 중복 된 항목이있는 배열

$ matches = [ "jorge", "melvin", "chelsy", "melvin", "jorge", "smith"];

// [2] 중복 된 항목이없는 새 배열의 컨테이너

$ arr = [];

// [3] 복제 된 배열의 길이를 가져 와서 for 루프에 사용할 var len으로 설정합니다.

$ len = count ($ matches);

// [4] 배열 키 ($ i)와 일치하면 현재 루프에서 반복을 사용할 수 없습니다. // [4] 배열 $ arr 다음 일치하는 현재 반복 키 값을 밉니다 [$ i] // [4]를 배열 arr로 보냅니다.

for ($ i = 0; $ i if(array_search($matches[$i], $arr) === false){ array_push($arr,$matches[$i]); } } //print the array $arr. print_r($arr); //Result: Array ( [0] => jorge [1] => melvin [2] => chelsy [3] => smith )


-2

나는 어떤 기능을 사용하지 않고 이것을했다.

$arr = array("1", "2", "3", "4", "5", "4", "2", "1");

$len = count($arr);
for ($i = 0; $i < $len; $i++) {
  $temp = $arr[$i];
  $j = $i;
  for ($k = 0; $k < $len; $k++) {
    if ($k != $j) {
      if ($temp == $arr[$k]) {
        echo $temp."<br>";
        $arr[$k]=" ";
      }
    }
  }
}

for ($i = 0; $i < $len; $i++) {
  echo $arr[$i] . " <br><br>";
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.