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?

Aug 16 2020

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

3 ManashKumar Aug 16 2020 at 19:28

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
Noname Aug 16 2020 at 19:24

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
PrinceDorcis Aug 17 2020 at 01:33

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