ตัวดำเนินการยานอวกาศ PHP <=> ทำงานอย่างไรกับสตริง?

Aug 16 2020

ฉันค่อนข้างสับสนเล็กน้อยเกี่ยวกับฟังก์ชันการทำงานของตัวดำเนินการยานอวกาศในสตริง ในเอกสารระบุว่าการเปรียบเทียบดำเนินการตามกฎการเปรียบเทียบประเภทปกติของ PHP แต่ยังไม่ชัดเจนสำหรับฉัน! ฉันดูคำถาม stackoverflowนี้และทำการทดสอบบางอย่าง แต่ก็ยังสับสน

นี่คือรหัสที่ฉันทดสอบ:

<?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 อย่างไร? ขอบคุณสำหรับความช่วยเหลือ.

คำตอบ

3 ManashKumar Aug 16 2020 at 19:28

เปรียบเทียบสองนิพจน์

สำหรับสตริงจะใช้ค่า ASCII

ส่งกลับค่า -1, 0 หรือ 1 เมื่อนิพจน์แรกมีค่าน้อยกว่าเท่ากับหรือมากกว่านิพจน์ที่สองตามลำดับ

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

เมื่อคุณใช้กับสตริงจะเปลี่ยนจากซ้ายไปขวาและเปรียบเทียบอักขระแต่ละตัวในสตริงที่กำหนดเพื่อค้นหาความแตกต่างแรกจากนั้นจะเปรียบเทียบค่า ASCII ของอักขระที่เพิ่งพบนี้ ดังนั้น:

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

และมันเป็นตัวดำเนินการยานอวกาศแบบสตริงธรรมดา ๆ

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

การเปรียบเทียบสตริงจะขึ้นอยู่กับรหัส ASCII ของแต่ละตัวอักษรและลำดับตัวอักษร

สตริงทั้งหมดที่ขึ้นต้นด้วยอักษรตัวพิมพ์เล็กจะมากกว่าสตริงที่ขึ้นต้นด้วยตัวอักษรตัวพิมพ์ใหญ่ (เนื่องจากใน ASCII ตัวอักษรตัวพิมพ์ใหญ่จะแสดงด้วยตัวเลขตั้งแต่ 65 ถึง 90 ในขณะที่รหัสตัวอักษรพิมพ์เล็กอยู่ระหว่าง 97 ถึง 122)

การเปรียบเทียบจะทำทีละตัวอักษรและจะหยุดทันทีที่ตัวอักษรสองตัวในตำแหน่งเดียวกันต่างกัน

สิ่งนี้เมื่อรวมกับลำดับตัวอักษรจะทำให้ตัวอย่าง:

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