PHP strcasecmp 작동 원리


strcasecmp

[ PHP 목차 보기 ]

  • 두 문자의 사전적 순서(크기 비교)를 할 때 사용하는 점에서는 strcmp 함수[참고 1]와 strncmp 함수[참고 2]와 같다.
  • 차이점은 대소문자를 구분하지 않는다는 점출력값으로 운영체제와 상관없이 아스키 값의 차이가 나온다는 점이다. 자세한 내용은 아래에 예제와 함께 자세히 설명하였다.
  • str은 string을, case는 대소문자를, cmp는 comparison을 뜻한다.
strcasecmp($string1, $string2)
- 첫번째 인자 자료형 ($string1): 문자열
- 두번째 인자 자료형 ($string2): 문자열
- 반환 자료형: int

0을 반환

  • strcmp 함수와 공통점: 인자로 전달된 두 문자열이 같다면 0을 반환한다.
  • strcmp 함수와 차이점: strcasecmp은 대소문자를 구별하지 않는다.
  • 아래 코드는, strcmp와 strcasecmp를 비교해보는 예제이다.
  • 결과를 보면 strcmp음수를 반환하고, strcasecmp0을 반환한다. 즉, 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)

음수 반환

  • 첫 문자열이 두 번째 문자열보다 사전 순서가 앞에 있다면 음수를 반환한다. (첫 문자열 < 두 번째 문자열)
  • 사전 순서는 아스키 숫자에 의해 결정된다. 예를 들어 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)

양수 반환

  • 첫 문자열이 두 번째 문자열보다 사전 순서가 뒤에 있다면 양수를 반환한다. (첫 문자열 > 두번째 문자열)
  • 아래 코드에서 첫 문자열의 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(“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)

콜백함수로 사용된 예제

  • 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 )

참고
[1] strcmp 함수
[2] strncmp 함수

[ PHP 목차 보기 ]

Leave a Reply