PHP 7 中的 <=>('Spaceship' 运算符)是什么?
What is <=> (the 'Spaceship' Operator) in PHP 7?
PHP7、今年11月份出的会引入Spaceship(<=>)操作符。它是什么以及它是如何工作的?
这个问题在我们关于 PHP 运算符的一般参考问题中已经有 an answer。
<=>
("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
这是一个新的组合比较运算符。类似于 strcmp()
或 version_compare() 的行为,但它可以用于所有通用 PHP 值,具有与 <
、<=
、==
、>=
、>
。如果两个操作数相等,则为 returns 0
,如果左侧更大,则为 1
,如果右侧更大,则为 -1
。它使用与我们现有的比较运算符完全相同的比较规则:<
、<=
、==
、>=
和 >
。
根据 the RFC that introduced the operator,$a <=> $b
计算为:
- 0 如果
$a == $b
- -1 如果
$a < $b
- 1 如果
$a > $b
这似乎是我尝试过的每种情况下的实际情况,尽管严格来说 official docs 只提供稍弱的保证 $a <=> $b
将 return
an integer less than, equal to, or greater than zero when $a
is respectively less than, equal to, or greater than $b
无论如何,你为什么要这样的操作员?同样,RFC 解决了这个问题——这几乎完全是为了让为 usort
(and the similar uasort
and uksort
).
编写比较函数更加方便
usort
将要排序的数组作为第一个参数,将用户定义的比较函数作为第二个参数。它使用该比较函数来确定数组中的一对元素中的哪一个更大。比较函数需要return:
an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.
宇宙飞船操作员使这个简洁方便:
$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'];
});
可以在 RFC 的 Usefulness 部分中找到使用 spaceship 运算符编写的比较函数的更多示例。
PHP7、今年11月份出的会引入Spaceship(<=>)操作符。它是什么以及它是如何工作的?
这个问题在我们关于 PHP 运算符的一般参考问题中已经有 an answer。
<=>
("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
这是一个新的组合比较运算符。类似于 strcmp()
或 version_compare() 的行为,但它可以用于所有通用 PHP 值,具有与 <
、<=
、==
、>=
、>
。如果两个操作数相等,则为 returns 0
,如果左侧更大,则为 1
,如果右侧更大,则为 -1
。它使用与我们现有的比较运算符完全相同的比较规则:<
、<=
、==
、>=
和 >
。
根据 the RFC that introduced the operator,$a <=> $b
计算为:
- 0 如果
$a == $b
- -1 如果
$a < $b
- 1 如果
$a > $b
这似乎是我尝试过的每种情况下的实际情况,尽管严格来说 official docs 只提供稍弱的保证 $a <=> $b
将 return
an integer less than, equal to, or greater than zero when
$a
is respectively less than, equal to, or greater than$b
无论如何,你为什么要这样的操作员?同样,RFC 解决了这个问题——这几乎完全是为了让为 usort
(and the similar uasort
and uksort
).
usort
将要排序的数组作为第一个参数,将用户定义的比较函数作为第二个参数。它使用该比较函数来确定数组中的一对元素中的哪一个更大。比较函数需要return:
an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.
宇宙飞船操作员使这个简洁方便:
$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'];
});
可以在 RFC 的 Usefulness 部分中找到使用 spaceship 运算符编写的比较函数的更多示例。