问题描述
我有点困惑太空飞船操作员在弦上的功能。 他们在documentation中说,比较是根据PHP的常用类型comparison rules执行的,但对我来说还不清楚! 我看着这个stackoverflow question,做了一些测试,但仍然感到困惑。
这是我测试过的代码:
<?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值?谢谢您的帮助。
解决方法
比较两个表达式。
对于字符串,它使用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,3]; // 0
echo [1,3] <=> []; // 1
echo [1,1]; // 1
echo [1,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
,
在字符串上使用时,它将从左到右,比较给定字符串中的每个字符以找到第一个差异,然后它将比较刚刚找到的另一个字符的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
,
字符串比较基于每个字母的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
,
我阅读了所有答案,但对我来说这还不够,因为我的主题是 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
。