Bagaimana tepatnya operator pesawat luar angkasa PHP <=> bekerja pada string?
Saya sedikit bingung tentang fungsi operator pesawat luar angkasa pada string. Dalam dokumentasi mereka mengatakan bahwa perbandingan dilakukan sesuai dengan aturan perbandingan tipe biasa PHP tetapi belum jelas bagi saya! Saya melihat pertanyaan stackoverflow ini dan melakukan beberapa tes tetapi masih bingung.
Ini kode yang saya uji:
<?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
Bagaimana cara menggunakan nilai ASCII? Terima kasih atas bantuan Anda.
Jawaban
Bandingkan dua ekspresi.
Untuk string menggunakan nilai ASCII.
Ini mengembalikan -1, 0 atau 1 ketika ekspresi pertama masing-masing kurang dari, sama dengan, atau lebih besar dari ekspresi kedua.
// 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
Ketika Anda menggunakan string, itu akan pergi dari kiri ke kanan, dan membandingkan setiap karakter dalam string yang diberikan untuk menemukan perbedaan pertama, kemudian itu akan membandingkan nilai ASCII dari karakter yang baru ditemukan ini. Begitu:
"aaa" < "aaaa" // because 4th char: '' < 'a'
"baaaaaa" > "abbb" // because 1st char 'b' > 'a'
"aaaaaaa" < "bbbb" // because 1st char 'a' < 'b'
Dan, itu adalah operator pesawat ruang angkasa string sederhana
$str1 <=> $str2 will return :
1 if $str1 > $str2
-1 if $str1 < $str2
0 if $str1 = $str2
Perbandingan String didasarkan pada kode ASCII setiap huruf dan urutan abjad.
Semua string yang dimulai dengan huruf kecil akan lebih besar daripada string yang dimulai dengan huruf besar (karena dalam ASCII, huruf besar diwakili oleh angka 65 hingga 90, sedangkan kode huruf kecil dari 97 hingga 122)
Perbandingan dilakukan huruf demi huruf dan dihentikan segera setelah dua huruf dari posisi yang sama berbeda.
Ini, dikombinasikan dengan urutan abjad akan memberikan misalnya:
// "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