¿Cómo funciona exactamente el operador de nave espacial PHP <=> en cadenas?
Estoy un poco confundido sobre el funcionamiento del operador de la nave espacial en la cuerda. En la documentación , dicen que las comparaciones se realizan de acuerdo con las reglas de comparación de tipos habituales de PHP, ¡ pero aún no las tengo claras! Miré esta pregunta de stackoverflow e hice algunas pruebas, pero aún estaba confundido.
Aquí está el código que probé:
<?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
¿Cómo usa los valores ASCII? Gracias por ayudar.
Respuestas
Compara dos expresiones.
Para la cadena, usa los valores ASCII.
Devuelve -1, 0 o 1 cuando la primera expresión es, respectivamente, menor, igual o mayor que la segunda expresión.
// 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
Cuando use cadenas, irá de izquierda a derecha y comparará cada carácter en la cadena dada para encontrar una primera diferencia, luego comparará el valor ASCII de este carácter diferente que acaba de encontrar. Entonces:
"aaa" < "aaaa" // because 4th char: '' < 'a'
"baaaaaa" > "abbb" // because 1st char 'b' > 'a'
"aaaaaaa" < "bbbb" // because 1st char 'a' < 'b'
Y es un operador de nave espacial de cadena simple
$str1 <=> $str2 will return :
1 if $str1 > $str2
-1 if $str1 < $str2
0 if $str1 = $str2
La comparación de cadenas se basa en el código ASCII de cada letra y el orden alfabético.
Todas las cadenas que comienzan con letras minúsculas serán mayores que las que comienzan con letras mayúsculas (porque en ASCII, las letras mayúsculas están representadas por números del 65 al 90, mientras que el código de las letras minúsculas es del 97 al 122)
La comparación se hace letra por letra y se detiene tan pronto como dos letras de la misma posición sean diferentes.
Esto, combinado con el orden alfabético dará por ejemplo:
// "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