PHP的太空船操作符<=>如何在字符串上精确运作?

3
我对字符串上的 spaceship 运算符的工作原理有些困惑。
文档中,他们说比较是根据 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值?谢谢你的帮助。


这些结果中哪一个让你感到困惑? - Nico Haase
4个回答

5

比较两个表达式。

对于字符串,它使用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

2
字符串比较基于每个字母的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

2
当你使用字符串时,它会从左到右逐个比较给定字符串中的每个字符,找到第一个不同之处,然后比较刚找到的不同字符的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

2

我看过所有的答案,但对于我来说还不够,因为我的主题是关于 PHP 如何内部处理事情。所以我进行了搜索,结果发现 PHP 在字符串上使用运算符 <=> 进行比较,逐个字符比较,并且当只有一个不同字符时停止比较,使用的 ASCII 码如下:

<?php

$str1 = "aaaaaaa";
$str2 = "bbbb";

echo $str1 <=> $str2, PHP_EOL; // -1

print_r(unpack("C*", $str1));
print_r(unpack("C*", $str2));


// output
 Array
(
    [1] => 97
    [2] => 97
    [3] => 97
    [4] => 97
    [5] => 97
    [6] => 97
    [7] => 97
)
Array
(
    [1] => 98
    [2] => 98
    [3] => 98
    [4] => 98
)

这就解释了为什么 $str1 <=> $str2 === -1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接