Como o operador da nave espacial do PHP <=> funciona exatamente em strings?
Estou um pouco confuso sobre o funcionamento do operador da nave espacial na string. Na documentação, eles dizem que as comparações são realizadas de acordo com as regras usuais de comparação de tipos do PHP, mas ainda não estão claras para mim! Eu olhei para esta questão stackoverflow e fiz alguns testes, mas ainda confuso.
Aqui está o código que testei:
<?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
Como ele usa os valores ASCII? Obrigado pela ajuda.
Respostas
Compare duas expressões.
Para string, ele usa os valores ASCII.
Ele retorna -1, 0 ou 1 quando a primeira expressão é respectivamente menor, igual ou maior que a segunda expressão.
// 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
Quando você usa em strings, ele vai da esquerda para a direita, e compara cada caractere na string dada para encontrar uma primeira diferença, então ele vai comparar o valor ASCII desse caractere diferente encontrado. Então:
"aaa" < "aaaa" // because 4th char: '' < 'a'
"baaaaaa" > "abbb" // because 1st char 'b' > 'a'
"aaaaaaa" < "bbbb" // because 1st char 'a' < 'b'
E, é um operador de nave espacial de string simples
$str1 <=> $str2 will return :
1 if $str1 > $str2
-1 if $str1 < $str2
0 if $str1 = $str2
A comparação de strings é baseada no código ASCII de cada letra e na ordem alfabética.
Todas as strings que começam com letras minúsculas serão maiores do que strings que começam com letras maiúsculas (porque em ASCII, as letras maiúsculas são representadas por números de 65 a 90, enquanto o código de letras minúsculas vai de 97 a 122)
A comparação é feita letra a letra e é interrompida assim que duas letras na mesma posição forem diferentes.
Isso, combinado com a ordem alfabética, dará, por exemplo:
// "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