Menu

PHP in_array(): 배열에 값이 있는지 확인하기

in_array($needle, $haystack)는 값이 배열에 있으면 true를 반환합니다. 세 번째 인수로 true를 넘기면(in_array('1', $ids, true)) 타입까지 일치해야 하는 엄격한 확인이 됩니다. strict 플래그, 대소문자 무시 검색, 여러 값 확인, 중첩 배열, 빠른 isset 대안을 알아봅니다.

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

in_array($needle, $haystack)는 값이 배열 어딘가에 있으면 true, 없으면 false를 반환합니다. 세 번째 인수로 true를 넘겨 in_array($needle, $haystack, true)로 쓰면 타입까지 같아야 하며, 기본적으로 쓸 형태는 이 엄격한 형태입니다.

in_array()는 값만 봅니다. 키가 있는지 확인하려면 array_key_exists()나 isset()을 쓰세요.

strict 매개변수

세 번째 인수가 없으면 in_array()는 ==로 비교하며, 비교 전에 타입을 변환합니다. true를 주면 ===로 비교해 값과 타입이 모두 일치해야 합니다. 배열에 숫자와 문자열이 섞이는 순간 차이가 드러나며, 폼, URL, CSV 파일에서 온 데이터에서는 흔한 일입니다.

아래 각 셀은 PHP 8.3에서 그 값 쌍에 대해 ==와 ===가 반환하는 결과입니다. in_array()는 사용하는 모드의 표에서 찾는 값과 어떤 요소의 조합이 true이면 true를 답합니다. 탭을 바꿔 가며 null, true, 숫자 문자열 행을 보세요.

in_array 느슨한 비교(==)와 엄격한 비교(===)의 일치
Point at or tap a cell to read it as PHP.
$a == $btruefalsenull01"0""1""""abc""10""1e1"10[]
true
false
null
0
1
"0"
"1"
""
"abc"
"10"
"1e1"
10
[]
Every cell computed by PHP 8.3.19.

PHP 8에서 규칙 하나가 바뀌었습니다. 숫자가 아닌 문자열은 더 이상 0과 같지 않으므로 in_array('abc', [0])은 지금은 false지만 PHP 7에서는 true였습니다. PHP 7용 코드가 이것에 의존하기도 했으며, 변환 규칙에 기대지 말고 true를 넘겨야 하는 또 하나의 이유입니다. 규칙 전체는 비교 연산자 페이지에서 설명합니다.

대소문자를 무시하는 in_array

in_array()는 문자열을 정확히 비교하므로 'PHP'와 'php'는 다릅니다. 확인하기 전에 찾는 값과 배열을 모두 소문자로 바꾸세요. mb_strtolower()는 악센트가 있는 글자와 라틴 문자가 아닌 글자도 처리합니다.

여러 값을 한 번에 확인하기

in_array()는 찾는 값을 하나만 받습니다. 여러 개라면 배열을 집합으로 비교하세요. array_diff()는 없는 값을 반환하므로 빈 결과는 모두 있다는 뜻이고, array_intersect()는 찾은 값을 반환합니다.

array_diff()와 array_intersect()는 값을 문자열로 비교하므로 여기서는 1과 '1'이 같은 것으로 취급됩니다.

다차원 배열에서 in_array

in_array()는 중첩 배열 안을 검색하지 않습니다. 어떤 행의 필드에 특정 값이 있는지 확인하려면 먼저 array_column()으로 그 필드를 뽑은 다음 평평한 목록에서 검색하세요.

마지막 줄은 찾는 값 자체가 배열일 수도 있음을 보여 줍니다. 키, 값, 순서가 모두 같은 행과 일치합니다.

in_array, array_search, isset 비교

셋 다 "있는가?"에 답하지만 반환하는 것과 속도가 다릅니다.

호출반환값큰 배열에서의 속도
in_array($v, $arr, true)true 또는 false모든 요소를 훑음
array_search($v, $arr, true)키 또는 false모든 요소를 훑음
isset($set[$v])true 또는 false해시 조회 한 번

값이 어디에 있는지 알아야 한다면 array_search()를 쓰세요. 같은 큰 목록에 대해 많은 값을 확인한다면 목록을 한 번 뒤집어 값이 키가 되게 하고 isset()을 쓰세요.

시간은 실행할 때마다 달라지지만 격차는 그대로입니다. isset() 조회는 일정하게 유지되고 in_array()는 목록 크기에 따라 늘어납니다. array_flip()은 문자열과 정수 값에만 동작하고 중복은 키 하나로 합쳐지지만, 포함 여부 확인에는 문제가 되지 않습니다.

자주 묻는 질문

in_array의 세 번째 매개변수는 무엇을 하나요?

엄격한 비교를 켭니다. in_array($x, $arr, true)는 ===로 비교하므로 값뿐 아니라 타입도 일치해야 합니다: in_array('1', [1, 2], true)는 false입니다. 이 인수가 없으면 PHP는 ==로 비교하며 먼저 타입을 변환합니다.

in_array는 항상 strict 모드로 써야 하나요?

대개 그렇습니다. 느슨한 모드에서는 in_array(null, [0]), in_array(true, ['any string']), in_array('1e1', ['10'])이 모두 true를 반환합니다. 폼에서 온 '5'가 정수 5와 일치하기를 일부러 원할 때만 끄세요.

in_array에서 대소문자를 무시하려면 어떻게 하나요?

양쪽을 소문자로 바꾸세요: in_array(strtolower($needle), array_map('strtolower', $haystack), true). 텍스트에 ASCII가 아닌 글자가 들어갈 수 있다면 mb_strtolower를 쓰세요.

여러 값이 배열에 있는지 확인하려면 어떻게 하나요?

모두 있어야 한다면 남는 것이 없는지 확인하세요: !array_diff($needles, $haystack). 하나 이상이면 된다면 겹치는 것이 있는지 확인하세요: (bool) array_intersect($needles, $haystack).

in_array는 느린가요?

배열을 요소마다 훑기 때문에, 큰 배열을 여러 번 확인하면 느립니다. $set = array_flip($haystack);로 배열을 한 번 뒤집고 isset($set[$value])를 쓰면 해시 조회 한 번으로 끝납니다.

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

Coddy로 코딩 배우기

시작하기