PHP uzay gemisi operatörü <=> dizeler üzerinde tam olarak nasıl çalışır?

Aug 16 2020

Uzay gemisi operatörünün ipteki işlevi konusunda biraz kafam karıştı. Gelen belgeler bunlar karşılaştırmalar PHP'nin zamanki tip göre yapılır söylemek karşılaştırma kuralları ancak henüz bana belli değil! Bu yığın aşımı sorusuna baktım ve bazı testler yaptım ama yine de kafam karıştı.

İşte test ettiğim kod:

<?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 değerlerini nasıl kullanır? Yardımın için teşekkürler.

Yanıtlar

3 ManashKumar Aug 16 2020 at 19:28

İki ifadeyi karşılaştırın.

Dize için ASCII değerlerini kullanır.

İlk ifade sırasıyla ikinci ifadeden küçük, ona eşit veya büyük olduğunda -1, 0 veya 1 döndürür.

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

Dizelerde kullandığınızda, soldan sağa gidecek ve verilen dizedeki her karakteri karşılaştırarak bir ilk farkı bulacak, sonra bulduğu bu farklı karakterin ASCII değerini karşılaştıracaktır. Yani:

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

Ve basit bir uzay gemisi operatörüdür

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

Dize karşılaştırması, her harfin ASCII koduna ve alfabetik sıraya dayanır.

Küçük harflerle başlayan tüm dizeler, büyük harflerle başlayan dizelerden daha büyük olacaktır (çünkü ASCII'de büyük harfler 65'den 90'a kadar sayılarla temsil edilirken, küçük harf kodu 97'den 122'ye kadardır)

Karşılaştırma, harf harf yapılır ve aynı konumdaki iki harf farklı olduğu anda durdurulur.

Bu, alfabetik sırayla birleştirildiğinde örneğin şunları verecektir:

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