Cách hoạt động chính xác của toán tử tàu vũ trụ PHP trên các chuỗi?
Tôi hơi bối rối về cách hoạt động của toán tử tàu vũ trụ trên chuỗi. Trong tài liệu họ nói rằng các phép so sánh được thực hiện theo các quy tắc so sánh kiểu thông thường của PHP nhưng tôi chưa rõ ràng! Tôi đã xem câu hỏi stackoverflow này và làm một số bài kiểm tra nhưng vẫn còn nhầm lẫn.
Đây là mã tôi đã kiểm tra:
<?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
Nó sử dụng các giá trị ASCII như thế nào? Cám ơn bạn vì đã giúp.
Trả lời
So sánh hai biểu thức.
Đối với chuỗi, nó sử dụng các giá trị ASCII.
Nó trả về -1, 0 hoặc 1 khi biểu thức đầu tiên tương ứng nhỏ hơn, bằng hoặc lớn hơn biểu thức thứ hai.
// 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
Khi bạn sử dụng trên chuỗi, nó sẽ đi từ trái sang phải và so sánh từng ký tự trong chuỗi đã cho để tìm ra điểm khác biệt đầu tiên, sau đó nó sẽ so sánh giá trị ASCII của ký tự khác vừa tìm thấy này. Vì thế:
"aaa" < "aaaa" // because 4th char: '' < 'a'
"baaaaaa" > "abbb" // because 1st char 'b' > 'a'
"aaaaaaa" < "bbbb" // because 1st char 'a' < 'b'
Và, nó là một toán tử tàu vũ trụ chuỗi đơn giản
$str1 <=> $str2 will return :
1 if $str1 > $str2
-1 if $str1 < $str2
0 if $str1 = $str2
So sánh chuỗi dựa trên mã ASCII của mỗi chữ cái và thứ tự bảng chữ cái.
Tất cả các chuỗi bắt đầu bằng chữ thường sẽ lớn hơn chuỗi bắt đầu bằng chữ hoa (vì trong ASCII, chữ hoa được biểu thị bằng các số từ 65 đến 90, trong khi mã chữ thường là từ 97 đến 122)
Việc so sánh được thực hiện từng chữ cái và dừng lại ngay khi hai chữ cái cùng vị trí khác nhau.
Điều này, kết hợp với thứ tự bảng chữ cái sẽ cho ví dụ:
// "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