Menu

PHP 배열 중복 제거 array_unique() 사용법

array_unique($array)는 중복 값을 제거하고 각 값의 첫 번째 항목을 원래 키와 함께 유지합니다. 결과 번호 다시 매기기, 대소문자 무시 중복 제거, 다차원 배열의 중복 제거, 중복 값 세고 찾기를 알아봅니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

array_unique($array)는 중복 값을 제거한 배열을 반환합니다. 각 값의 첫 번째 항목이 원래 키 아래에 남고, 나중의 복사본은 버려집니다.

첫 번째 결과는 키 0, 1, 3을 유지합니다. 각 값이 처음 나타난 위치입니다. 예를 들어 json_encode 전에 깔끔한 리스트가 필요하면 호출을 array_values()로 감싸세요.

array_unique가 두 값을 같다고 판단하는 방법

기본적으로 각 값을 문자열로 바꾸어 그 문자열을 비교합니다. 그래서 1, "1", 1.0은 같은 값으로 취급되고 첫 번째가 남습니다. 두 번째 인수가 비교 방식을 바꿉니다.

플래그두 값이 중복인 경우
SORT_STRING(기본값)(string) $a === (string) $b
SORT_REGULAR$a == $b
SORT_NUMERIC숫자로서 같을 때

기본값에서는 문자열 "01"이 문자열 "1"과 다르므로 "01"이 살아남습니다. SORT_REGULAR에서는 "01" == 1이 참이므로 버려집니다. 느슨한 비교에서는 불리언 true가 비어 있지 않은 모든 값과 일치하기도 합니다. 타입이 섞인 경우에는 결과를 믿기 전에 출력을 확인하세요. 규칙은 비교 연산자 페이지에서 설명합니다.

대소문자를 무시하고 중복 제거하기

array_unique는 대소문자를 구분합니다. "PHP"와 "php"는 다릅니다. 둘을 중복으로 취급하되 첫 번째 것의 원래 철자를 유지하려면, 소문자로 바꾼 복사본에서 고유한 키를 찾고 원본에서 그 키만 남기세요.

array_map은 같은 키를 가진 소문자 복사본을 만들고, array_unique는 첫 번째 항목의 키를 남기며, array_intersect_key는 원래 배열에서 그 키들을 골라냅니다. 악센트가 있거나 한글 같은 텍스트라면 strtolower 대신 mb_strtolower를 쓰세요.

다차원 배열에서 array_unique

플래그가 없으면 array_unique는 모든 행을 문자열 "Array"로 바꾸므로 모든 행이 같아 보이고 첫 번째만 남으며, 행마다 "Array to string conversion" 경고가 납니다. 행 전체를 비교하려면 SORT_REGULAR를 넘기세요. 필드 하나의 값마다 한 행을 남기려면 null과 인덱스 키를 주는 array_column이 더 간단합니다.

두 번째 방법은 같은 키 아래에서 나중 행이 앞의 행을 덮어쓰므로 이메일마다 마지막 행을 남깁니다. 인덱스 키는 array_column 페이지에서 자세히 설명합니다.

중복 값 찾고 세기

array_count_values()는 각 값이 몇 번 나오는지 반환합니다. 개수가 1보다 큰 것만 걸러 내면 중복이 됩니다.

마지막 확인은 배열에 중복이 하나라도 있는지 검사하는 흔한 한 줄 코드입니다.

큰 배열에서 더 빠르게 고유한 값 얻기

array_unique는 비교 전에 모든 값을 문자열로 바꾸며, 값이 수천 개라면 문제없습니다. 정수나 문자열의 큰 목록이라면 배열을 뒤집는 편이 더 빠릅니다. 값이 키가 되고, 키는 정의상 고유합니다.

시간은 실행할 때마다 달라지지만 뒤집는 방식이 보통 몇 배 빠릅니다. 배열 키가 될 수 있는 값(정수와 문자열)에만 동작하며, "5" 같은 숫자 문자열은 정수로 돌아옵니다.

자주 묻는 질문

array_unique는 키를 유지하나요?

네. 각 값의 첫 번째 항목을 원래 키 아래에 두고 나중 것들을 버리므로 키에 빈틈이 생길 수 있습니다. 0부터 다시 매기려면 array_values(array_unique($arr))를 쓰세요.

다차원 배열에 array_unique를 쓰려면 어떻게 하나요?

행 전체를 비교하도록 SORT_REGULAR를 넘기세요: array_unique($rows, SORT_REGULAR). 이메일마다 한 행처럼 필드 값마다 한 행을 남기려면 그 필드로 행을 인덱싱하세요. array_column($rows, null, 'email')은 이메일마다 마지막 행을 남깁니다.

대소문자를 무시하고 중복을 제거하려면 어떻게 하나요?

소문자로 바꾼 복사본에서 고유한 키를 찾고 원본에서 그 키만 남기세요: array_intersect_key($arr, array_unique(array_map('strtolower', $arr))). ASCII 밖의 텍스트에는 mb_strtolower를 쓰세요.

PHP 배열에서 어떤 값이 중복되는지 찾으려면 어떻게 하나요?

array_count_values($arr)로 세고, 개수가 1보다 큰 것만 남기세요: array_keys(array_filter(array_count_values($arr), fn($n) => $n > 1)). array_count_values는 문자열과 정수에서만 동작합니다.

Coddy 프로그래밍 언어 일러스트

Coddy로 코딩 배우기

시작하기