如何按PHP中给定键的值对关联数组的数组进行排序?

给定此数组:

$inventory = array(

   array("type"=>"fruit", "price"=>3.50),
   array("type"=>"milk", "price"=>2.90),
   array("type"=>"pork", "price"=>5.43),

);

我想按价格对 的元素进行排序,以获得:$inventory

$inventory = array(

   array("type"=>"pork", "price"=>5.43),
   array("type"=>"fruit", "price"=>3.50),
   array("type"=>"milk", "price"=>2.90),

);

我该怎么做?


答案 1

你是对的,你要找的函数是array_multisort()

下面是直接从手册中获取并根据您的情况进行调整的示例:

$price = array();
foreach ($inventory as $key => $row)
{
    $price[$key] = $row['price'];
}
array_multisort($price, SORT_DESC, $inventory);

从 PHP 5.5.0 开始,您可以使用以下命令来代替该 foreach:array_column()

$price = array_column($inventory, 'price');

array_multisort($price, SORT_DESC, $inventory);

答案 2

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']usortusort

从比较函数返回非整数值(如 float)将导致内部强制转换为回调返回值的整数。因此,诸如 0.99 和 0.1 之类的值都将转换为整数值 0,这会将这些值进行比较为相等。

这是在 PHP 5.x 中使用时要记住的重要陷阱!我这个答案的原始版本犯了这个错误,但我在数千个观点上累积了十个赞成票,显然没有人注意到这个严重的错误。像我这样的智者可以很容易地搞砸比较器函数,这正是在PHP 7中将更易于使用的宇宙飞船运算符添加到语言中的原因。usort