Come funziona esattamente l'operatore di astronave PHP <=> sulle stringhe?

Aug 16 2020

Sono un po 'confuso sul funzionamento dell'operatore dell'astronave su stringa. Nella documentazione si dice che i confronti vengono eseguiti secondo le solite regole di confronto dei tipi di PHP ma non sono ancora chiari! Ho guardato questa domanda su stackoverflow e ho fatto alcuni test ma ancora confuso.

Ecco il codice che ho provato:

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

Come utilizza i valori ASCII? Grazie per il tuo aiuto.

Risposte

3 ManashKumar Aug 16 2020 at 19:28

Confronta due espressioni.

Per la stringa utilizza i valori ASCII.

Restituisce -1, 0 o 1 quando la prima espressione è rispettivamente minore, uguale o maggiore della seconda espressione.

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

Quando si utilizza su stringhe, andrà da sinistra a destra e confronterà ogni carattere nella stringa data per trovare una prima differenza, quindi confronterà il valore ASCII di questo carattere diverso appena trovato. Così:

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

Ed è un semplice operatore di astronave stringa

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

Il confronto delle stringhe si basa sul codice ASCII di ogni lettera e sull'ordine alfabetico.

Tutte le stringhe che iniziano con lettere minuscole saranno maggiori delle stringhe che iniziano con lettere maiuscole (perché in ASCII le lettere maiuscole sono rappresentate da numeri da 65 a 90, mentre il codice in minuscolo va da 97 a 122)

Il confronto viene fatto lettera per lettera e viene interrotto non appena due lettere della stessa posizione sono diverse.

Questo, combinato con l'ordine alfabetico darà ad esempio:

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