Menu

PHP array_key_exists(): 배열 키 존재 확인

array_key_exists('key', $array)는 배열에 그 키가 있으면 값이 null이어도 true를 반환합니다. isset($array['key'])는 더 빠르지만 null 값에는 false를 반환합니다. 둘의 차이, key_exists(), 중첩 키, 여러 키 확인, 객체에 property_exists()가 필요한 이유를 알아봅니다.

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

array_key_exists('key', $array)는 배열에 그 키가 있으면 true, 없으면 false를 반환합니다. 순서에 주의하세요. 키가 먼저, 배열이 두 번째입니다. 키 아래 저장된 값이 null이어도 true를 반환하며, 이것이 isset()이 하지 않는 유일한 일입니다.

키가 아니라 값을 확인하려면 in_array()를 쓰세요.

array_key_exists와 isset

둘 다 키를 확인합니다. 값이 null일 때만 의견이 갈립니다. isset()은 null 값을 "설정되지 않음"으로 취급하고, array_key_exists()는 배열에 실제로 있는 것을 알려 줍니다.

0과 ''는 둘 다 설정된 것으로 봅니다. 둘을 가르는 것은 null뿐입니다. 어느 쪽이 필요한지는 데이터에서 null이 무엇을 뜻하는지에 달려 있습니다.

  • null이 "값 없음"을 뜻한다면 isset()을 쓰세요. 흔한 경우이고, 언어 구조라서(조금 더 빠름) 중첩 경로와 정의되지 않은 변수도 경고 없이 받습니다.
  • null이 없는 키와 구별해야 하는 진짜 값이라면 array_key_exists()를 쓰세요. null로 보낸 JSON 필드, NULL인 데이터베이스 컬럼, 지우려고 일부러 null로 설정한 옵션 같은 경우입니다.

여러 변수를 한 번에 확인하는 것을 포함한 다른 용도는 isset 페이지에서 다룹니다.

JSON 페이로드에서 null과 누락 구별하기

array_key_exists()만 올바른 답을 주는 대표적인 경우입니다. JSON으로 레코드를 수정하는 API에서 null로 보낸 필드는 "지워라", 빠진 필드는 "건드리지 마라"를 뜻합니다. isset()은 둘을 같은 것으로 봅니다.

isset($patch[$field])를 썼다면 null이 빠진 필드처럼 보여서 전화번호가 그대로 남았을 것입니다.

key_exists()는 같은 함수

key_exists()는 초기 PHP부터 남아 있는 array_key_exists()의 별칭입니다. 인수도 결과도 같습니다. 읽는 사람이 예상하는 전체 이름을 쓰세요.

키 타입: "1"과 1은 같은 키

배열 키는 정수나 문자열이며, 평범한 10진 정수인 문자열은 정수로 저장됩니다. 그래서 array_key_exists('1', $arr)는 키 1을 찾고, 반대도 마찬가지입니다. '01' 같은 문자열은 문자열로 남고 다른 키입니다.

중첩 키와 여러 키 확인하기

array_key_exists()는 한 단계만 봅니다. null이 중요하지 않은 중첩 경로에는 isset($a['x']['y'])가 모든 단계를 한 번에 확인합니다. 중요한 경로라면 짧은 헬퍼로 단계를 따라가세요. 여러 키가 모두 있는지 확인하려면 array_diff_key()와 비교하세요.

array_flip($required)는 이름 목록을 키로 바꿔 array_diff_key()가 입력의 키와 비교할 수 있게 합니다. 남는 것이 빠진 필드의 목록이며, 그대로 에러 메시지에 쓸 수 있습니다.

객체에는 property_exists

예전 PHP는 array_key_exists()에 객체를 받았습니다. PHP 8은 대신 TypeError를 던집니다. 객체에는 선언된 속성이나 동적 속성(값이 null이어도)을 확인하는 property_exists()를 쓰고, isset($obj->prop)는 배열의 isset()처럼 동작합니다.

마지막 두 줄은 다른 방법을 보여 줍니다. get_object_vars()는 객체의 접근 가능한 속성을 배열로 바꾸며, 그다음에는 배열 함수를 쓸 수 있습니다.

자주 묻는 질문

array_key_exists는 true인데 isset은 false를 반환하는 이유는 무엇인가요?

키의 값이 null이기 때문입니다. isset($arr['k'])는 키가 있고 값이 null이 아닐 때만 true이고, array_key_exists('k', $arr)는 키가 배열에 있기만 하면 true입니다. 0, '', false를 포함한 다른 모든 값에 대해서는 둘이 같은 답을 줍니다.

PHP의 key_exists는 무엇인가요?

array_key_exists()의 별칭입니다. key_exists('id', $row)와 array_key_exists('id', $row)는 똑같이 동작합니다. 대부분의 코드는 긴 이름을 씁니다.

PHP에서 중첩 키가 있는지 확인하려면 어떻게 하나요?

각 단계를 확인하세요. isset($data['user']['address']['city'])는 경로 전체를 한 번에 확인하며 중간 단계가 없어도 경고를 내지 않습니다. null 값도 있는 것으로 쳐야 한다면 array_key_exists()로 단계마다 경로를 따라가세요.

객체에 array_key_exists를 쓸 수 있나요?

아니요. PHP 8.0부터 객체를 넘기면 TypeError가 납니다. 선언된 속성에는 property_exists($obj, 'name')를, 또는 isset($obj->name)를 쓰세요.

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

Coddy로 코딩 배우기

시작하기