정의 및 사용 방법
- PHP 버전
- 4+
strcmp()
는
두 문자열의 이진(Binary) 값의 크기 순서를 비교하여, 첫 번째 문자열이 두 번째 문자열보다 앞서는지, 같은지, 뒤서는지를 음수, 0
, 양수로 나타내는 정수 값을 반환하는 함수입니다.
strcmp()
의 strcmp는 "string compare(문자열 비교)"의 줄임말이 사용된 것입니다.
이 함수는 주로 두 문자열의 이진(Binary) 값의 크기 순서를 비교하여, 정렬 알고리즘에 필요한 비교 값(음수, 0
, 양수)을 확인할 때 사용됩니다.
여기서 음수는 첫 번째 문자열이 두 번째 문자열보다 앞서는 경우, 0
은 같을 때, 양수는 뒤설 때를 의미합니다.
특징
- 이 함수는 숫자, 영어와 같은 바이트 단위 기반 문자열의 이진(Binary) 값의 크기 순서를 비교합니다.
- 한글, 일본어, 중국어 등과 같은 유니코드 기반 문자열은 정확히 비교되지 않습니다.
- 대소문자를 구분하여 비교합니다.
- 두 문자열을 바이트 단위로 순서대로 비교하다가 처음으로 다른 바이트가 나타나면, 그 두 바이트의 이진 값의 차이를 정수로 반환하는 함수입니다.
기본 예제
$str1 = 'apple';
$str2 = 'banana';
$result = strcmp($str1, $str2);
/*
* 음수는 첫 번째 문자열이 두 번째 문자열보다 앞서는 경우,
* 0은 같을 때,
* 양수는 뒤설 때를 의미
*/
echo $result; // -1 : $str1이 $str2보다 앞섬
구문
strcmp(string $string1, string $string2): int
매개변수
$string1 |
첫 번째 비교 대상 문자열입니다.
문자열이 아닌 경우 Warning 에러가 발생합니다. |
---|---|
$string2 |
두 번째 비교 대상 문자열입니다.
문자열이 아닌 경우 Warning 에러가 발생합니다. |
반환 값
반환 값 = (첫 번째 불일치 지점의 $string1
의 바이트 이진 값) − (첫 번째 불일치 지점의 $string2
의 바이트 이진 값)
- 음수:
$string1
이$string2
보다 앞섬 0
:$string1
과$string2
이 같음- 양수:
$string1
이$string2
보다 뒤섬 - 값의 부호(음수/
0
/양수의 방향) 외에는 특정 의미를 신뢰성 있게 추론할 수 없습니다.
경고!
PHP 5.x 계열 등 과거 버전에서는 strcmp()
에 문자열이 아닌 값(예: 배열)이 전달될 때 NULL
을 반환할 수 있습니다. 느슨한 비교 연산자(==
)를 사용하면 NULL == 0
이 true
로 평가되어 인증 우회 등 보안 문제를 유발할 수 있으므로, 어떤 PHP 버전에서든 strcmp()
의 반환 값은 엄격 비교(=== 0
)로 검사하고, 입력값이 문자열인지 먼저 확인하거나 명시적으로 문자열로 변환해야 합니다. 이러한 이유로 인해 strcmp()
로 인증(비밀번호 검사, 토큰 검증 등)을 수행하는 것은 적절하지 않습니다.
변경 이력
버전 | 설명 |
---|---|
8.2.0 | 이전에는 이 함수는 문자열 길이가 서로 다를 때, 비교 결과로 문자열 길이의 차이와 관련된 임의의 정수를 반환하는 경우가 있었습니다. 대신 이제 -1 또는 1 을 반환할 수 있습니다. |
추가 예제
$str1 = 'Apple';
$str2 = 'apple';
$result = strcmp($str1, $str2);
// 대문자가 소문자보다 앞섬
echo $result; // -32 : $str1이 $str2보다 앞섬
$str1 = 'Hello';
$str2 = 'Hello!';
$result = strcmp($str1, $str2);
// 문자열의 끝까지 바이트 값 순서를 비교
echo $result; // -1 : $str1이 $str2보다 앞섬
$str1 = 'Hello';
$str2 = 'Hello';
$result = strcmp($str1, $str2);
echo $result; // 0 : $str1과 $str2가 같음
$str1 = 'HTML';
$str2 = 'CSS';
$result = strcmp($str1, $str2);
echo $result; // 5 : $str1이 $str2보다 뒤섬