PHP 宇宙飞船运算符 <=> 到底如何作用于字符串?

我对字符串上的宇宙飞船运算符的功能有点困惑。在文档中,他们说比较是根据 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 值?谢谢你的帮助。


湖上湖
浏览 123回答 4
4回答

慕哥6287543

比较两个表达式。对于字符串,它使用 ASCII 值。当第一个表达式分别小于、等于或大于第二个表达式时,它返回 -1、0 或 1。// Integersecho 1 <=> 1; // 0echo 1 <=> 2; // -1echo 2 <=> 1; // 1&nbsp;// Floatsecho 1.5 <=> 1.5; // 0echo 1.5 <=> 2.5; // -1echo 2.5 <=> 1.5; // 1&nbsp;// Stringsecho "a" <=> "a"; // 0echo "a" <=> "b"; // -1echo "b" <=> "a"; // 1&nbsp;echo "a" <=> "aa"; // -1echo "zz" <=> "aa"; // 1&nbsp;// Arraysecho [] <=> []; // 0echo [1, 2, 3] <=> [1, 2, 3]; // 0echo [1, 2, 3] <=> []; // 1echo [1, 2, 3] <=> [1, 2, 1]; // 1echo [1, 2, 3] <=> [1, 2, 4]; // -1&nbsp;// Objects$a = (object) ["a" => "b"];&nbsp;$b = (object) ["a" => "b"];&nbsp;echo $a <=> $b; // 0&nbsp;$a = (object) ["a" => "b"];&nbsp;$b = (object) ["a" => "c"];&nbsp;echo $a <=> $b; // -1&nbsp;$a = (object) ["a" => "c"];&nbsp;$b = (object) ["a" => "b"];&nbsp;echo $a <=> $b; // 1&nbsp;// not only values are compared; keys must match$a = (object) ["a" => "b"];&nbsp;$b = (object) ["b" => "b"];&nbsp;echo $a <=> $b; // 1

达令说

我阅读了所有答案,但这对我来说还不够,因为对我来说主题是PHP 如何在内部做事。于是我搜索了又搜索,结果发现 PHP 使用运算符 <=> 对字符串进行逐个字符的比较,当只有一个不同的字符时,它会停止,并且使用 ASCII 代码,如下所示:<?php$str1 = "aaaaaaa";$str2 = "bbbb";echo $str1 <=> $str2, PHP_EOL; // -1print_r(unpack("C*", $str1));print_r(unpack("C*", $str2));// output&nbsp;Array(&nbsp; &nbsp; [1] => 97&nbsp; &nbsp; [2] => 97&nbsp; &nbsp; [3] => 97&nbsp; &nbsp; [4] => 97&nbsp; &nbsp; [5] => 97&nbsp; &nbsp; [6] => 97&nbsp; &nbsp; [7] => 97)Array(&nbsp; &nbsp; [1] => 98&nbsp; &nbsp; [2] => 98&nbsp; &nbsp; [3] => 98&nbsp; &nbsp; [4] => 98)这就解释了为什么$str1 <=> $str2 === -1。

慕尼黑8549860

字符串比较基于每个字母的 ASCII 代码和字母顺序。所有以小写字母开头的字符串都会比以大写字母开头的字符串大(因为在 ASCII 中,大写字母用 65 到 90 的数字表示,而小写字母的代码是 97 到 122)比较是逐个字母进行的,一旦相同位置的两个字母不同就停止比较。结合字母顺序,例如:// "a" comes before "aa" so:&nbsp;"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

千万里不及你

当你在字符串上使用时,它会从左到右,比较给定字符串中的每个字符以找到第一个差异,然后它会比较刚刚找到的不同字符的 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 < $str20 if $str1 = $str2
打开App,查看更多内容
随时随地看视频慕课网APP