PHP 7+
由于PHP 7的,这可以用简洁来完成usort
与匿名函数使用的飞船操作比较元素。
您可以像这样进行升序排列:
usort($inventory, function ($item1, $item2) {
return $item1['price'] <=> $item2['price'];
});
或者像这样的降序排序:
usort($inventory, function ($item1, $item2) {
return $item2['price'] <=> $item1['price'];
});
要了解其工作原理,请注意,它usort
采用了用户提供的比较功能,该功能必须具有以下功能(来自文档):
如果第一个参数被认为分别小于,等于或大于第二个参数,则比较函数必须返回小于,等于或大于零的整数。
还要注意<=>
,飞船操作员
如果两个操作数相等,则返回0;如果左边较大,则返回1;如果右边较大,则返回-1。
这正是usort
需要的。实际上,添加<=>
到https://wiki.php.net/rfc/combined-comparison-operator中的语言所提供的全部理由几乎就是
使编写订购回调usort()
更加容易
PHP 5.3以上
PHP 5.3引入了匿名函数,但是还没有太空飞船操作符。我们仍然usort
可以对数组进行排序,但是它有点冗长,更难以理解:
usort($inventory, function ($item1, $item2) {
if ($item1['price'] == $item2['price']) return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
});
请注意,尽管处理整数值的比较器只返回值的差(例如)是很普遍的,但在这种情况下$item2['price'] - $item1['price']
,我们不能安全地做到这一点。这是因为在问问者的示例中,价格是浮点数,但是传递给我们的比较函数usort
必须返回整数usort
才能正常工作:
从比较函数返回非整数值(例如float)将导致内部转换为回调返回值的整数。因此,诸如0.99和0.1的值都将强制转换为整数值0,这会将这些值进行比较。
usort
在PHP 5.x中使用时,这是一个重要的陷阱!这个答案的原始版本犯了这个错误,但是我显然在没有人注意到这个严重错误的情况下,对数千个视图进行了十次投票。像我这样的笨拙者可以轻松搞定比较器功能,这正是在PHP 7中向该语言添加了更易于使用的太空飞船运算符的原因。