Как 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? Спасибо за помощь.
Ответы
Сравните два выражения.
Для строки используются значения 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
Когда вы используете строки, он будет идти слева направо и сравнивать каждый символ в данной строке, чтобы найти первое различие, затем он будет сравнивать значение 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
Сравнение строк основано на коде 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