根据the RFC that introduced the operator,$a <=> $b 的计算结果为:
- 0 如果
$a == $b
- -1 如果
$a < $b
- 1 如果
$a > $b
在我尝试过的每种情况下,实践中似乎都是这种情况,尽管严格来说,official docs 仅提供稍弱的保证$a <=> $b 将返回
当$a分别小于、等于或大于$b时,一个小于、等于或大于零的整数
不管怎样,你为什么要这样的操作员?同样,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 的 Usefulness 部分找到。