php 飞船运算符究竟如何比较字符串、数组和对象
How exactly php spaceship operator compare strings, arrays and objects
我想知道 php 宇宙飞船运算符如何比较字符串、对象和数组。例如,下面的代码。
echo "Its Me at SO" <=> "Its Me at SO";
将 return 0,因为我知道所有字符都相同,计数相同。但是如果我有如下代码:
echo "Its me at SO" <=> "its Me at so";
会return1,表示左边大于右边,但是怎么办呢?它是比较 ASCII 值吗?
现在让我们来谈谈数组。下面的代码将 return 0,因为两个数组的计数、值和每个索引处的值都相等。
echo [1,2,3] <=> [1,2,3];
但是下面的代码returns -1
echo [1,2,3] <=> [3,2,1];
我不明白为什么?这个运算符如何比较数组以及它如何计算出左边的数组小于右边的数组?
对象也是如此。
任何人都可以详细回答它如何处理字符串、数组和对象吗?
谢谢
根据新功能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
"Comparisons are performed according to PHP's usual type comparison rules (http://php.net/manual/en/types.comparisons.php)".
1) 是的,它使用 ASCII 值
2) 如果数组长度不同,则数组越小,数组越小。
否则它会逐个键比较数组,给予 "earlier" 值优先权。例如先比较 $arr1[0]
和 $arr2[0]
。如果 $arr1
具有 $arr2
中不存在的键,则数组不可比较(例如,如果我们使用 non-numeric 数组)。
// 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的实际代码,只是所用逻辑的近似表示。
本质上,它以类似于比较 big-endian 数字的方式处理数组。它将 $arr1[0]
与 $arr2[0]
进行比较。如果它们不同,则 returns -1 或 1 取决于哪个较大。如果它们相同,则继续 $arr1[1]
和 $arr2[1]
。如果所有值都相同它 returns 0(数组相等)
虽然不完全相同,但将 [1,2,3] <=> [3,2,1]
视为基本等同于 123 <=> 321...
可能更简单
我想知道 php 宇宙飞船运算符如何比较字符串、对象和数组。例如,下面的代码。
echo "Its Me at SO" <=> "Its Me at SO";
将 return 0,因为我知道所有字符都相同,计数相同。但是如果我有如下代码:
echo "Its me at SO" <=> "its Me at so";
会return1,表示左边大于右边,但是怎么办呢?它是比较 ASCII 值吗?
现在让我们来谈谈数组。下面的代码将 return 0,因为两个数组的计数、值和每个索引处的值都相等。
echo [1,2,3] <=> [1,2,3];
但是下面的代码returns -1
echo [1,2,3] <=> [3,2,1];
我不明白为什么?这个运算符如何比较数组以及它如何计算出左边的数组小于右边的数组? 对象也是如此。
任何人都可以详细回答它如何处理字符串、数组和对象吗?
谢谢
根据新功能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
"Comparisons are performed according to PHP's usual type comparison rules (http://php.net/manual/en/types.comparisons.php)".
1) 是的,它使用 ASCII 值
2) 如果数组长度不同,则数组越小,数组越小。
否则它会逐个键比较数组,给予 "earlier" 值优先权。例如先比较 $arr1[0]
和 $arr2[0]
。如果 $arr1
具有 $arr2
中不存在的键,则数组不可比较(例如,如果我们使用 non-numeric 数组)。
// 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的实际代码,只是所用逻辑的近似表示。
本质上,它以类似于比较 big-endian 数字的方式处理数组。它将 $arr1[0]
与 $arr2[0]
进行比较。如果它们不同,则 returns -1 或 1 取决于哪个较大。如果它们相同,则继续 $arr1[1]
和 $arr2[1]
。如果所有值都相同它 returns 0(数组相等)
虽然不完全相同,但将 [1,2,3] <=> [3,2,1]
视为基本等同于 123 <=> 321...