PHP 7+
从 PHP 7 开始,这可以通过使用 usort 和使用 spaceship operator 比较元素的 anonymous function 来简洁地完成。
你可以像这样进行升序排序:
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 引入了匿名函数,但还没有 spaceship 运算符。我们仍然可以使用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 时要牢记的一个重要陷阱! My original version of this answer 犯了这个错误,但我显然在没有人注意到严重错误的情况下,对数千个视图累积了十个赞成票。像我这样的笨蛋可以轻松搞砸比较器函数正是在 PHP 7 中将更易于使用的宇宙飞船运算符添加到语言中的原因。