PHP의 in_array() 함수가 예상과 달리 true를 반환하는 현상은 주로 문자열에서 숫자로의 자동 형변환 때문에 발생합니다. 함수에 문자열이 전달되면 해당 문자열은 숫자 0으로 변환되며, 이 변환된 값이 검색 대상 값과 비교되면서 일치 판정이 이루어지는 것입니다.
느슨한 비교(Loose Comparison)와 타입 저글링
PHP는 배열 요소를 비교할 때 기본적으로 ===가 아닌 ==를 사용하는 느슨한 비교(loose comparison) 방식을 채택하고 있습니다. 그 결과 값만 비교할 뿐 데이터 타입까지는 확인하지 않습니다.
여기에 더해 PHP의 타입 저글링(type juggling) 특성도 한몫합니다. 타입 저글링이란 변수의 타입이 코드 실행 맥락에 따라 유동적으로 처리되는 것을 의미합니다. 예를 들어 부동 소수점(float) 값을 변수에 할당하면 그 변수는 실수 타입으로 동작하고, 문자열을 정수로 캐스팅하면 정수처럼 행동합니다.
해결 방법: 세 번째 매개변수로 엄격 모드 활성화
이러한 예상치 못한 동작을 피하려면 in_array()의 세 번째 매개변수에 true를 전달하면 됩니다. 이렇게 하면 엄격 모드(strict mode)로 비교가 수행되어 값뿐만 아니라 데이터 타입까지 함께 검사하게 됩니다.
in_array($needle, $haystack, true); // 엄격한 비교 활성화
문자열 전달 시 함수의 동작 예시
아래는 문자열이 전달되었을 때 함수가 어떻게 동작하는지 보여주는 예제입니다.
예제
echo intval("Hello");
출력 결과
위 코드는 다음과 같은 결과를 출력합니다.
0
"Hello"처럼 숫자로 시작하지 않는 문자열은 정수 0으로 변환됩니다. 따라서 배열에 0이 포함되어 있다면 in_array()는 이를 일치하는 것으로 판단해 true를 반환하게 되는 것입니다. 이러한 오류를 방지하려면 항상 엄격 모드를 사용하는 것이 좋습니다.