Comment l'opérateur de vaisseau spatial PHP <=> fonctionne exactement sur les chaînes?

Aug 16 2020

Je suis un peu confus au sujet du fonctionnement de l'opérateur du vaisseau spatial sur la chaîne. Dans la documentation, ils disent que les comparaisons sont effectuées selon les règles de comparaison de types habituelles de PHP mais pas encore claires pour moi! J'ai regardé cette question de stackoverflow et j'ai fait quelques tests mais toujours confus.

Voici le code que j'ai testé:

<?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

Comment utilise-t-il les valeurs ASCII? Merci pour l'aide.

Réponses

3 ManashKumar Aug 16 2020 at 19:28

Comparez deux expressions.

Pour la chaîne, il utilise les valeurs ASCII.

Il renvoie -1, 0 ou 1 lorsque la première expression est respectivement inférieure, égale ou supérieure à la seconde expression.

// 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 Aug 16 2020 at 19:24

Lorsque vous utilisez sur des chaînes, il ira de gauche à droite et comparera chaque caractère de la chaîne donnée pour trouver une première différence, puis il comparera la valeur ASCII de ce caractère différent qui vient d'être trouvé. Alors:

"aaa" < "aaaa" // because 4th char: '' < 'a'
"baaaaaa" > "abbb" // because 1st char 'b' > 'a'
"aaaaaaa" < "bbbb" // because 1st char 'a' < 'b'

Et, c'est un simple opérateur de vaisseau spatial de chaîne

$str1 <=> $str2 will return :
1 if $str1 > $str2
-1 if $str1 < $str2
0 if $str1 = $str2
PrinceDorcis Aug 17 2020 at 01:33

La comparaison de chaînes est basée sur le code ASCII de chaque lettre et l'ordre alphabétique.

Toutes les chaînes commençant par des lettres minuscules seront plus grandes que les chaînes commençant par des lettres majuscules (car en ASCII, les lettres majuscules sont représentées par des chiffres de 65 à 90, tandis que le code des lettres minuscules est de 97 à 122)

La comparaison se fait lettre par lettre et s'arrête dès que deux lettres de même position sont différentes.

Ceci, combiné à l'ordre alphabétique donnera par exemple:

// "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