php太空飞船运营商究竟如何比较字符串,数组和对象

时间:2016-01-15 12:56:12

标签: php php-7

我想知道php太空飞船运营商如何比较字符串,对象和数组。例如,下面的代码。

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

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

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

它将返回1,意味着左侧大于右侧,但如何?它是在比较ASCII值吗?

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

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

但是下面的代码返回-1

<ul>

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

任何人都可以详细解答它如何与字符串,数组和对象一起使用吗?

谢谢

2 个答案:

答案 0 :(得分:7)

“比较是根据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...

可能更为简单

答案 1 :(得分: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