给定这个数组:
$inventory = array(
array("type"=>"fruit", "price"=>3.50),
array("type"=>"milk", "price"=>2.90),
array("type"=>"pork", "price"=>5.43),
);
我想 sort $inventory's elements by price 得到:
$inventory = array(
array("type"=>"pork", "price"=>5.43),
array("type"=>"fruit", "price"=>3.50),
array("type"=>"milk", "price"=>2.90),
);
我怎样才能做到这一点?
16 回答
你是对的,你正在寻找的功能是array_multisort() .
以下是直接从手册中获取的示例,并根据您的情况进行了调整:
PHP 7
从PHP 7开始,这可以使用usort简洁地完成,使用anonymous function使用spaceship operator来比较元素 .
你可以这样做一个升序排序:
或者是这样的降序:
要了解其工作原理,请注意
usort
采用用户提供的比较函数,该函数的行为必须如下(来自文档):还要注意
<=>
,宇宙飞船运营商,这正是
usort
所需要的 . 实际上,几乎为https://wiki.php.net/rfc/combined-comparison-operator中的语言添加<=>
的整个理由是它PHP 5.3
PHP 5.3引入了匿名函数,但还没有太空船运营商 . 我们仍然可以使用
usort
对我们的数组进行排序,但它更冗长,更难理解:请注意,虽然处理整数值的比较器只返回值的差异(如
$item2['price'] - $item1['price']
)是相当常见的,但在这种情况下我们无法安全地执行此操作 . 这是因为价格是问题提供者示例中的浮点数,但我们传递给usort
的比较函数必须返回usort
整数才能正常工作:在PHP 5.x中使用
usort
时,这是一个重要的陷阱! My original version of this answer犯了这个错误,然而我却在没有任何人注意到这个严重错误的情况下累积了数十个观点 . 像我这样的缺乏人员可以轻松搞砸比较器功能正是在PHP 7中将易于使用的太空船操作员添加到语言中的原因 .由于数组元素本身是带有字符串键的数组,因此最好的办法是定义自定义比较函数 . 它非常快速和容易 . 试试这个:
产生以下内容:
虽然其他人已正确建议使用
array_multisort()
,但出于某种原因,似乎没有答案承认array_column()
的存在,这可以大大简化解决方案 . 所以我的建议是:我结束了这个:
只需调用该函数,传递数组和第二级数组的字段名称 . 喜欢:
您可以将usort与匿名函数一起使用,例如
输出:
Was tested on 100 000 records: 以秒为单位的时间(由函数microtime计算) . 仅用于排序键位置的唯一值 .
Solution of function of @Josh Davis: 上传时间:1.5768740177155
Mine solution: 暂停时间:0.094044923782349
Solution:
您可以尝试定义自己的比较函数,然后使用usort .
此功能可重复使用:
默认情况下,它在字符串值上运行良好,但如果所有值都是数字,则必须为number comparison function提供回调 .
来自Sort an array of associative arrays by value of given key in php:
uasort(http://php.net/uasort)允许您通过自己定义的函数对数组进行排序 . 在你的情况下,这很简单:
Complete Dynamic Function 我跳到这里进行关联数组排序,并在http://php.net/manual/en/function.sort.php上找到了这个神奇的功能 . 此函数非常动态,使用指定键按升序和降序排序 .
通过特定键对数组进行排序的简单功能 . 维护索引关联
简单的解决方案:)
输出是,
试试这个:
供参考,请参阅:http://php.net/manual/en/function.asort.php
在这里看到各种排序标志:http://www.php.net/manual/en/function.sort.php