PHP的太空船运算符如何比较字符串、数组和对象?

10
我想知道php中的太空船运算符如何比较字符串、对象和数组。例如,下面的代码。
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]; 

我不明白为什么会这样?这个操作符是���何比较数组的,以及如何计算左侧的数组小于右侧的数组? 对于对象也是同样的情况。
有人能详细解释一下它是如何处理字符串、数组和对象的吗?
谢谢。

2
它将以与比较运算符相同的方式执行等式/不等式检查。因此,它将以与其他运算符、数组或任何内容相同的方式比较字符串。太空船只是一个“包装器”,在底层仍然使用相同的逻辑。 - Alma Do
1
"echo "Its Me at SO" <=> "its Me at SO"; will return 0". 对我来说并不是这样:它返回1,这正是我所期望的,因为 "i" 大于 "I"。你真的会得到0吗? - Adam Cameron
抱歉,那是我的笔误。我已经更新了我的回答。 - Altaf Hussain
4个回答

11

“比较根据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] <=> [3,2,1]123 <=> 321... 基本上是等价的,可能更简单些。

2
根据新功能文档
比较根据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

0

太空船数组 php8

 <?php
    echo [] <=> []; // result is  0
    echo [1, 2, 3] <=> [1, 2, 3]; // result is 0
    echo [1, 2, 3] <=> []; // 1
    echo [1, 2, 3] <=> [1, 2, 1]; // 1
    echo [1, 2, 3] <=> [1, 2, 4]; // -1
    echo [1,2,3,1] <=> [1,2,4];//1 //thats mean index first piority,1st array index number getter then 2nd array so its positive answer 1
    echo [1,2,4] <=> [1,2,3,1]//-1

0
比较数组、对象或字符串使用 PHP太空船操作符(<=>)遵循与 其他PHP比较操作符 相同的规则:

字符串比较

字符串按字典顺序进行比较:

echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1

echo "a" <=> "aa"; // -1
echo "zz" <=> "aa"; // 1

数组比较

数组的比较基于以下几点:

  1. 数组元素较少的被认为是较小的;
  2. 长度相同但键不同的数组是无法比较的;
  3. 长度和键相同的数组会返回第一个不相等的结果;
  4. 长度和键/值对相同的数组被认为是相等的.
// array with fewer elements is considered smaller

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

// arrays with same length but different keys are incomparable, always returning 1

echo ['a' => 1, 'b' => 2, 'c' => 3] <=> ['a' => 1, 'b' => 2, 'd' => 4]; // 1
echo ['a' => 1, 'b' => 2, 'c' => 3] <=> ['a' => 1, 'b' => 2, 'd' => 4]; // 1

// arrays with same length and keys return comparison result of first non-equal value

echo ['a' => 1, 'b' => 2, 'c' => 4] <=> ['a' => 1, 'b' => 3, 'c' => 2]; // -1

// arrays with same length and key/value pairs are equal, regardless of order

echo ['a' => 1, 'b' => 2, 'c' => 3] <=> ['c' => 3, 'b' => 2, 'a' => 1]; // 0

写了一篇博客文章,供那些对学习更多信息感兴趣的人阅读。

对象比较

对象比较基于以下几点:

  1. 不同类的对象无法比较
  2. 相同类的对象,如果属性值不同,则返回第一个不相等的结果
  3. 相同类的对象,如果属性值相同,则认为它们相等
// objects of different classes are incomparable, always returning 1

class Foo {}
class Bar {}

echo new Foo() <=> new Bar(); // 1
echo new Bar() <=> new Foo(); // 1

// objects of same class with different property values return first non-equal result

class Car
{
  public function __construct(
    private string $name,
  ) {}
}

$car1 = new Car('Porsche');
$car2 = new Car('Lamborghini');

echo $car1 <=> $car2; // 1
echo $car2 <=> $car1; // -1

// objects of same class with same property values are equal

class Car
{
  public function __construct(
    private string $name,
  ) {}
}

$car1 = new Car('Porsche');
$car2 = new Car('Porsche');

echo $car1 <=> $car2; // 0
echo $car2 <=> $car1; // 0

写了一篇博客文章,供那些对进一步了解感兴趣的人阅读。

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