PHP 우주선 연산자 <=>가 문자열에서 정확히 어떻게 작동합니까?
나는 문자열에 대한 우주선 연산자의 기능에 대해 약간 혼란 스럽습니다. 에서 문서 그들은 비교가 PHP의 일반적인 유형에 따라 수행되는 것을 말한다 비교 규칙 아직 나에게 지울 수 없습니다! 이 stackoverflow 질문을 보고 몇 가지 테스트를 수행했지만 여전히 혼란 스럽습니다.
내가 테스트 한 코드는 다음과 같습니다.
<?php
$str1 = "aaa"; $str2 = "aaaa";
echo $str1 <=> $str2, PHP_EOL; // -1
$str1 = "baaaaaa"; $str2 = "abbb";
echo $str1 <=> $str2, PHP_EOL; // 1
$str1 = "aaaaaaa"; $str2 = "bbbb";
echo $str1 <=> $str2, PHP_EOL; // -1
ASCII 값을 어떻게 사용합니까? 도움을 주셔서 감사합니다.
답변
3 ManashKumar
두 표현을 비교하십시오.
문자열의 경우 ASCII 값을 사용합니다.
첫 번째 표현식이 두 번째 표현식보다 작거나 같거나 크면 -1, 0 또는 1을 반환합니다.
// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
echo "a" <=> "aa"; // -1
echo "zz" <=> "aa"; // 1
// Arrays
echo [] <=> []; // 0
echo [1, 2, 3] <=> [1, 2, 3]; // 0
echo [1, 2, 3] <=> []; // 1
echo [1, 2, 3] <=> [1, 2, 1]; // 1
echo [1, 2, 3] <=> [1, 2, 4]; // -1
// Objects
$a = (object) ["a" => "b"]; $b = (object) ["a" => "b"];
echo $a <=> $b; // 0
$a = (object) ["a" => "b"]; $b = (object) ["a" => "c"];
echo $a <=> $b; // -1
$a = (object) ["a" => "c"]; $b = (object) ["a" => "b"];
echo $a <=> $b; // 1
// not only values are compared; keys must match
$a = (object) ["a" => "b"]; $b = (object) ["b" => "b"];
echo $a <=> $b; // 1
Noname
문자열에서 사용하면 왼쪽에서 오른쪽으로 이동하고 주어진 문자열의 각 문자를 비교하여 첫 번째 차이점을 찾은 다음 방금 찾은 다른 문자의 ASCII 값을 비교합니다. 그래서:
"aaa" < "aaaa" // because 4th char: '' < 'a'
"baaaaaa" > "abbb" // because 1st char 'b' > 'a'
"aaaaaaa" < "bbbb" // because 1st char 'a' < 'b'
그리고 이것은 간단한 문자열 우주선 연산자입니다.
$str1 <=> $str2 will return :
1 if $str1 > $str2
-1 if $str1 < $str2
0 if $str1 = $str2
PrinceDorcis
문자열 비교는 각 문자의 ASCII 코드와 알파벳 순서를 기반으로합니다.
소문자로 시작하는 모든 문자열은 대문자로 시작하는 문자열보다 큽니다 (ASCII에서 대문자는 65에서 90 사이의 숫자로 표시되는 반면 소문자 코드는 97에서 122까지)
비교는 문자 단위로 이루어지며 동일한 위치의 두 문자가 다른 즉시 중지됩니다.
이것은 알파벳 순서와 결합하여 예를 들어 다음을 제공합니다.
// "a" comes before "aa" so:
"a" < "aa"
// and
"a" <=> "aa" === -1
// "b" comes after "B" so:
"b" > "B"
// and
"b" <=> "B" === 1
"Aa" === "Aa"
// and
"Aa" <=> "Aa" === 0
// Because uppercase < lowercase
// "Abb" comes before "abb"
"Abb" < "abb"
"Abb" <=> "abb" === -1
// Because uppercase < lowercase
"Abb" < "a"
"Abb" <=> "a" === -1
// Because uppercase < lowercase
"Bbb" < "a"
"Bbb" <=> "a" === -1
//
"Cbb" > "Baa"
"Cbb" <=> "Baa" === 1