为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
宝慕林4294392 2019-06-16 15:59:35
如何根据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),);我该怎么做?
查看完整描述

3 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

你说得对,你要找的是array_multisort().

下面是一个从手册中直接摘录并适应于您的案例的例子:

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

从PHP5.5.0开始,您可以使用Array_Column()代替这个foreach

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


查看完整回答
反对 回复 2019-06-16
?
湖上湖

TA贡献2003条经验 获得超2个赞

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接受用户提供的比较函数,其行为必须如下(来自docs):

如果第一个参数被认为分别小于、等于或大于第二个参数,则比较函数必须返回小于、等于或大于零的整数。

还要注意<=>太空船操作员,

如果两个操作数相等,则返回0,如果左大于1,则返回-1,如果右侧较大,则返回-1。

这正是usort需要。事实上,几乎所有添加<=>的语言https:/wiki.php.net/rfc/组合-比较-操作符是这样吗?

使编写顺序回调用于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正常工作:

回归非整数比较函数(如Float)中的值将导致回调返回值的内部强制转换为整数。因此,0.99和0.1这样的值都将转换为0的整数值,这将比较这些值是否相等。

这是在使用usort在PHP 5.x中!我对这个答案的原稿我犯了这个错误,但我在数千次浏览中累积了10次,显然没有人注意到这个严重的错误。像我这样笨手笨脚的人容易搞砸比较器的功能精确更容易使用的太空船运算符被添加到PHP 7语言中的原因。


查看完整回答
反对 回复 2019-06-16
?
POPMUISE

TA贡献1765条经验 获得超5个赞

而其他人则正确地建议使用array_multisort(),由于某些原因,似乎没有人承认array_column(),这可以大大简化解决方案。所以我的建议是:

array_multisort(array_column($inventory, 'price'), SORT_DESC, $inventory);


查看完整回答
反对 回复 2019-06-16
  • 3 回答
  • 0 关注
  • 676 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号