PHP 7引入了Spaceship (<=>)操作符。它是什么,它是如何工作的?
<=>
("Spaceship")运算符将提供组合比较,因为它将:
Return 0 if values on either side are equal
Return 1 if the value on the left is greater
Return -1 if the value on the right is greater
组合比较运算符使用的规则与PHP目前使用的比较运算符相同,即<
, <=
, ==
, >=
和>
。有Perl或Ruby编程背景的人可能已经熟悉这个为PHP7提议的新操作符。
//Comparing Integers
echo 1 <=> 1; //output 0
echo 3 <=> 4; //output -1
echo 4 <=> 3; //output 1
//String Comparison
echo "x" <=> "x"; //output 0
echo "x" <=> "y"; //output -1
echo "y" <=> "x"; //output 1
当您以这种方式比较字符串时,它将从左到右比较给定字符串中的每个字符以查看它们是否不同,直到找到差异,然后它将通过比较最后一个字符的ASCII值来决定哪个字符串更大。
根据引入该操作符的RFC, $a <=> $b
的计算结果为:
- 0 if
$a == $b
- -1 if
$a < $b
- 1 if
$a > $b
在我尝试过的每个场景中似乎都是这样,尽管严格来说官方文档只提供了$a <=> $b
将返回
当
$a
分别小于、等于或大于$b
时,小于、等于或大于0的整数
不管怎样,为什么需要这样的操作符?同样,RFC解决了这个问题——它几乎完全是为了更方便地为usort
(以及类似的uasort
和uksort
)编写比较函数。
usort
的第一个参数是要排序的数组,第二个参数是用户定义的比较函数。它使用比较函数来确定数组中对元素中哪个更大。比较函数需要返回:
如果认为第一个参数分别小于、等于或大于第二个参数,则
小于、等于或大于零的整数。
宇宙飞船操作员使这句话简洁而方便:
$things = [
[
'foo' => 5.5,
'bar' => 'abc'
],
[
'foo' => 7.7,
'bar' => 'xyz'
],
[
'foo' => 2.2,
'bar' => 'efg'
]
];
// Sort $things by 'foo' property, ascending
usort($things, function ($a, $b) {
return $a['foo'] <=> $b['foo'];
});
// Sort $things by 'bar' property, descending
usort($things, function ($a, $b) {
return $b['bar'] <=> $a['bar'];
});
使用spaceship操作符编写比较函数的更多示例可以在RFC的有用性部分找到。
这是一个用于组合比较的新操作符。在行为上类似于strcmp()
或version_compare(),但它可以用于所有具有相同语义的通用PHP值,如<
, <=
, ==
, >=
, >
。如果两个操作数相等,则返回0
,如果左侧大于右侧,则返回1
,如果右侧大于左侧,则返回-1
。它使用与我们现有的比较运算符<
、<=
、==
、>=
和>
完全相同的比较规则。
点击这里了解更多