【问题标题】:How exactly php spaceship operator compare strings, arrays and objectsphp spaceship 算子究竟如何比较字符串、数组和对象
【发布时间】:2016-01-15 12:56:12
【问题描述】:

我想知道 php spaceship 运算符如何比较字符串、对象和数组。例如,下面的代码。

echo "Its Me at SO" <=> "Its Me at SO"; 

将返回 0,因为我知道所有字符都相同,计数相同。但如果我有如下代码:

echo "Its me at SO" <=> "its Me at so"; 

它会返回1,表示左边大于右边,但是如何呢?它是在比较 ASCII 值吗?

现在让我们来看看数组。下面的代码将返回 0,因为两个数组的计数、值和每个索引处的值都相等。

echo [1,2,3] <=> [1,2,3];

但是下面的代码返回-1

echo [1,2,3] <=> [3,2,1]; 

我不明白为什么?该运算符如何比较数组以及如何计算左侧数组小于右侧数组? 对象也是如此。

谁能详细回答它如何处理字符串、数组和对象?

谢谢

【问题讨论】:

  • 它将以与比较运算符相同的方式进行相等/不等式检查。因此,它将以与其他运算符和数组或其他任何内容相同的方式比较字符串。 Spaceship 只是一个“包装器”,仍然在下面使用相同的逻辑
  • echo "Its Me at SO" &lt;=&gt; "its Me at SO"; 将返回 0”。对我来说不是:它返回 1,这是我所期望的,因为“i”大于“I”。你真的为此得到 0 分吗?
  • 对不起,这是我这边的拼写错误。更新了我的答案。

标签: php php-7


【解决方案1】:

"比较是根据 PHP 常用的类型比较规则 (http://php.net/manual/en/types.comparisons.php)"。

1) 是的,它使用 ASCII 值

2) 如果数组的长度不同,值越少的数组越小。

否则它会逐个键比较数组,给予“早期”值优先级。例如,首先将$arr1[0]$arr2[0] 进行比较。如果$arr1 有一个在$arr2 中不存在的键,则数组不可比较(例如,如果我们使用非数字数组)。

// Arrays are compared like this with standard comparison operators
// $arr1 and $arr2 are arrays
function standard_array_compare($arr1, $arr2)
{
   // If either array has more values, that array is considered "larger"
    if (count($arr1) < count($arr2)) {
        return -1; // $arr1 < $arr2
    } elseif (count($arr1) > count($arr2)) {
        return 1; // $arr1 > $arr2
    }

    //Otherwise compare the array values directly
    foreach ($arr1 as $key => $val) {
        if (!array_key_exists($key, $arr2)) {
            return null; // uncomparable, these arrays do not have the same keys
        } elseif ($val < $arr2[$key]) {
            return -1; // $arr1 < $arr2
        } elseif ($val > $arr2[$key]) {
            return 1; // $arr1 > $arr2
        }
    }
    return 0; // $arr1 == $arr2
}

注意,以上不是PHP的实际代码,只是所用逻辑的大概表示。

本质上,它处理数组的方式与比较大端数的方式类似。它将$arr1[0]$arr2[0] 进行比较。如果它们不同,则返回 -1 或 1,具体取决于哪个更大。如果它们相同,则转到$arr1[1]$arr2[1]。如果所有值都相同,则返回 0(数组相等)

虽然不完全相同,但将[1,2,3] &lt;=&gt; [3,2,1] 视为基本等同于123 &lt;=&gt; 321... 可能更简单

【讨论】:

    【解决方案2】:

    根据新功能documentation

    比较是根据 PHP 常用的类型比较规则进行的。

    <?php
    // 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
    

    【讨论】:

      猜你喜欢
      • 2011-12-31
      • 2021-06-19
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      相关资源
      最近更新 更多