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
这正是需要的。事实上,在 https://wiki.php.net/rfc/combined-comparison-operator 中添加语言的几乎全部理由是usort
<=>
使编写排序回调更易于使用usort()
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,这会将这些值进行比较为相等。
这是在 PHP 5.x 中使用时要记住的重要陷阱!我这个答案的原始版本犯了这个错误,但我在数千个观点上累积了十个赞成票,显然没有人注意到这个严重的错误。像我这样的智者可以很容易地搞砸比较器函数,这正是在PHP 7中将更易于使用的宇宙飞船运算符添加到语言中的原因。usort