【问题标题】:How the PHP spaceship operator <=> exactly works on strings?PHP 宇宙飞船运算符 <=> 如何准确地作用于字符串?
【发布时间】:2020-08-16 12:13:54
【问题描述】:

我对宇宙飞船运算符在字符串上的功能有点困惑。 在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 值?谢谢你的帮助。

【问题讨论】:

  • 以下哪个结果让您感到困惑?

标签: php php-7 string-comparison


【解决方案1】:

比较两个表达式。

对于字符串,它使用 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值。所以:

    "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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我阅读了所有答案,但这对我来说还不够,因为我的主题是 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 &lt;=&gt; $str2 === -1

        【讨论】:

          猜你喜欢
          • 2011-03-04
          • 2010-10-24
          • 2021-08-07
          • 1970-01-01
          • 2015-06-10
          • 2015-08-02
          • 2015-08-02
          • 2015-09-03
          相关资源
          最近更新 更多