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
正常工作:
从比较函数返回非整数值(如浮点数)将导致回调函数的返回值进行内部转换为整数。因此,诸如0.99和0.1之类的值都将被转换为整数值0,这将将这些值视为相等。
这是在使用 PHP 5.x 中
usort
时需要记住的一个重要陷阱!
我的原始版本答案犯了这个错误,但我在成千上万的浏览量中获得了十个赞,显然没有人注意到这个严重的错误。像我这样的笨蛋很容易搞砸比较函数,这正是在 PHP 7 中添加更易于使用的太空船操作符的原因。
price
列排在第一位,type
列排在第二位呢?这样,你就可以直接调用rsort()
函数了。https://3v4l.org/2meqs - mickmackusa