strcasecmp
- 두 문자의 사전적 순서(크기 비교)를 할 때 사용하는 점에서는 strcmp 함수[참고 1]와 strncmp 함수[참고 2]와 같다.
- 차이점은 대소문자를 구분하지 않는다는 점과 출력값으로 운영체제와 상관없이 아스키 값의 차이가 나온다는 점이다. 자세한 내용은 아래에 예제와 함께 자세히 설명하였다.
- str은 string을, case는 대소문자를, cmp는 comparison을 뜻한다.
strcasecmp($string1, $string2)
- 첫번째 인자 자료형 ($string1): 문자열
- 두번째 인자 자료형 ($string2): 문자열
- 반환 자료형: int
0을 반환
- strcmp 함수와 공통점: 인자로 전달된 두 문자열이 같다면 0을 반환한다.
- strcmp 함수와 차이점: strcasecmp은 대소문자를 구별하지 않는다.
- 아래 코드는, strcmp와 strcasecmp를 비교해보는 예제이다.
- 결과를 보면 strcmp는 음수를 반환하고, strcasecmp는 0을 반환한다. 즉, strcasecmp의 경우 “Hello”와 “hello”를 같은 값으로 처리하여 0을 반환한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php echo “[strcmp]<br>”; echo ‘$str1=”Hello”, $str2=”hello”<br>’; echo ‘strcmp($str1, $str2)의 출력값:<br>’; $str1 = “Hello”; $str2 = “hello”; var_dump(strcmp($str1, $str2)); echo “<br><br>”; echo “[strcasecmp]<br>”; echo ‘$str1=”Hello”, $str2=”hello”<br>’; echo ‘strcasecmp($str1, $str2)의 출력값:<br>’; $str1 = “Hello”; $str2 = “hello”; var_dump(strcasecmp($str1, $str2)); ?> | cs |
[strcmp]
$str1=”Hello”, $str2=”hello”
strcmp($str1, $str2)의 출력값:
int(-1)
[strcasecmp]
$str1=”Hello”, $str2=”hello”
strcasecmp($str1, $str2)의 출력값:
int(0)
$str1=”Hello”, $str2=”hello”
strcmp($str1, $str2)의 출력값:
int(-1)
[strcasecmp]
$str1=”Hello”, $str2=”hello”
strcasecmp($str1, $str2)의 출력값:
int(0)
음수 반환
- 첫 문자열이 두 번째 문자열보다 사전 순서가 앞에 있다면 음수를 반환한다. (첫 문자열 < 두 번째 문자열)
- 사전 순서는 아스키 숫자에 의해 결정된다. 예를 들어 a는 97이고, c는 99이다. 따라서 아래 코드의 결과는 음수를 반환한다. (참고로 echo ord(“a”);로 아스키 숫자를 볼 수 있다.)
- 주의할 점: strcmp는 운영체제 별로 반환하는 음수 숫자가 다르다.[참고 1] 하지만, strcasecmp는 운영체제와 상관 없이 두 문자열의 아스키 값의 차이가 출력값이 된다. a (아스키값 97) – c (아스키값 99) = -2이 출력된다.
1 2 3 4 5 6 7 | <?php echo ‘$str1=”a”, $str2=”c”<br>’; echo ‘strcasecmp($str1, $str2)의 출력값:<br>’; $str1 = “a”; $str2 = “c”; var_dump(strcasecmp($str1, $str2)); ?> | cs |
$str1=”c”, $str2=”a”
strcasecmp($str1, $str2)의 출력값:
int(-2)
strcasecmp($str1, $str2)의 출력값:
int(-2)
양수 반환
- 첫 문자열이 두 번째 문자열보다 사전 순서가 뒤에 있다면 양수를 반환한다. (첫 문자열 > 두번째 문자열)
- 아래 코드에서 첫 문자열의 c (아스키값 99)는 두 번째 문자열의 a (아스키 값 97)보다 사전 순서가 뒤에 있기 때문에, 양수 2 (99-97)를 반환한다. strcmp와 달리 운영체제에 상관없이 아스키 값의 차이가 출력된다.[참고 1]
1 2 3 4 5 6 7 | <?php echo ‘$str1=”c”, $str2=”a”<br>’; echo ‘strcasecmp($str1, $str2)의 출력값:<br>’; $str1 = “c”; $str2 = “a”; var_dump(strcasecmp($str1, $str2)); ?> | cs |
$str1=”c”, $str2=”a”
strcasecmp($str1, $str2)의 출력값:
int(2)
strcasecmp($str1, $str2)의 출력값:
int(2)
대소문자 변환 매커니즘
대문자와 소문자의 아스키 값을 계산할 때, 대문자를 소문자 아스키값에 변환시켜서 계산하는 것일까? 아니면 소문자를 대문자 아스키값에 변환시켜서 계산하는 것일까? 내부 매커니즘을 알아보자.
- 아래 코드는 대소문자의 아스키값 차이를 출력값과 비교하는 예제이다.
- strcasecmp(“A”, “{“) 의 출력값이 -26이 된 것을 보면, 97(a의 아스키 값) – 123 ({의 아스키값) = -26이 됨을 알 수 있다. 따라서 대문자를 소문자로 변환시켜서 계산한다는 것을 알 수 있다.
1 2 3 4 5 6 7 8 9 | <?php echo “A의 아스키 값: “.ord(“A”).“, a의 아스키 값: “.ord(“a”).“, {의 아스키 값: “.ord(“{“).“<br><br>”; echo ‘$str1=”A”, $str2=”{“<br>’; echo ‘strcasecmp($str1, $str2)의 출력값:<br>’; $str1 = “A”; $str2 = “{“; var_dump(strcasecmp($str1, $str2)); ?> | cs |
A의 아스키 값: 65, a의 아스키 값: 97, {의 아스키 값: 123
$str1=”A”, $str2=”{“
strcasecmp($str1, $str2)의 출력값:
int(-26)
$str1=”A”, $str2=”{“
strcasecmp($str1, $str2)의 출력값:
int(-26)
콜백함수로 사용된 예제
- strcasecmp는 함수이기 때문에, 콜백함수로 사용할 수 있다.
- 아래 코드는, array_uintersect 함수에 strcasecmp 함수를 콜백함수로 넣은 예제이다. $arr1과 $arr2의 공통된 값을 대문자에 구분없이 찾아내는 코드이다.
1 2 3 4 5 6 7 8 9 10 | <?php $arr1 = array(“banana”, “apple”, “grape”, “berry”); $arr2 = array(“Apple”, “Grape”, “Carrot”); $res = array_uintersect($arr1, $arr2, “strcasecmp”); echo ‘$arr1 = ‘; print_r($arr1); echo “<br>”; echo ‘$arr2 = ‘; print_r($arr2); echo “<br><br>”; echo ‘array_uintersect($arr1, $arr2, “strcasecmp”) 출력값<br>’; print_r($res); ?> | cs |
$arr1 = Array
(
[0] => banana
[1] => apple
[2] => grape
[3] => berry
)
$arr2 = Array ( [0] => Apple [1] => Grape [2] => Carrot )
array_uintersect($arr1, $arr2, “strcasecmp”) 출력값
Array ( [1] => apple [2] => grape )
$arr2 = Array ( [0] => Apple [1] => Grape [2] => Carrot )
array_uintersect($arr1, $arr2, “strcasecmp”) 출력값
Array ( [1] => apple [2] => grape )




