按照十进制值对多维数组进行排序

8

我想要做的是对一个包含小数值的多维数组进行排序。根据我的测试,浮点数在排序时存在问题。

Array
(
    [0] => Array
        (
            [company] => Ebay
            [weight] => 4.6
        )

    [1] => Array
        (
            [company] => Ebay
            [weight] => 1.7
        )

    [2] => Array
        (
            [company] => Ebay
            [weight] => 3.7
        )
)


usort($array, 'order_by_weight');

// Sorts DESC highest first
function order_by_weight($a, $b) {
    return $b['weight'] - $a['weight'];
}

什么是将这些数字按降序排列的最佳方法?

浮点数在排序时可能会出现问题 --- 不是的,你可能搞混了什么。 - zerkms
我已经拿了你的代码,它可以正常运行:http://ideone.com/cqW85m 你有试过运行吗? - zerkms
完成了,有一个答案(使用了你的代码并稍作修改) - zerkms
6个回答

21
$arr = array(
    array('company' => 'A', 'weight' => 4.6),
    array('company' => 'B', 'weight' => 1.7),
    array('company' => 'C', 'weight' => 3.7),
);

usort($arr, 'order_by_weight');

function order_by_weight($a, $b) {
    return $b['weight'] > $a['weight'] ? 1 : -1;
}

var_dump($arr);

提示:这并不是什么高深的技术 - 这个确切的“技巧”被用作http://php.net/usort的第一个例子。


我喜欢它,比array_multisort短得多,而且更容易阅读/使用! - Benz
@Benz:如果我们使用匿名函数,它甚至可以更短。 - zerkms
完全正确,但我们不知道TS PHP版本,我不确定,但我认为匿名函数的最低PHP版本是PHP 5.4。 - Benz
@Benz:它是5.3版本,这个版本现在非常流行。 - zerkms

3
你可以使用匿名函数在一行内完成这个操作。
$arr = array(
    array('company' => 'A', 'weight' => 4.6),
    array('company' => 'B', 'weight' => 1.7),
    array('company' => 'C', 'weight' => 3.7),
);
usort($arr, function($a, $b) { return $b['weight'] > $a['weight'] ;});

print_r($arr);

希望这可以帮到您:)

1

你可以使用array_multisort对数组进行排序,不过通常用于按多个数组值而不是一个进行排序。

echo "<pre>";

 $a = array(
     array('company' => 'ebay', 'weight' => 4.6), 
     array('company' => 'ebay', 'weight' => 1.7),
     array('company' => 'ebay', 'weight' => 3.7),
     array('company' => 'ebay', 'weight' => 2.7),
     array('company' => 'ebay', 'weight' => 9.7),
     array('company' => 'ebay', 'weight' => 0.7),
 );

 $company = array();
 $weight = array();

 foreach($a as $key=>$val) {
     array_push($company, $val['company']);
     array_push($weight, $val['weight']);
 }

 array_multisort($weight, SORT_ASC, $a);

 print_r($a);

0

之前发布的答案都没有展示按列值排序的最新语法。

如果使用usort(),请使用PHP7中的三路比较运算符(“太空船运算符”),如果您使用的是PHP7.4或更高版本,则可以享受“箭头函数”语法的简洁性。对于降序排序,请在运算符左侧写入$b,右侧写入$a。(演示

usort($arr, fn($a, $b) => $b['weight'] <=> $a['weight']);

array_multisort() 也可以使用,但需要额外的循环来分离数据列。(演示

array_multisort(array_column($arr, 'weight'), SORT_DESC, $arr);

0
如果有人想要更简洁的代码,特别是要处理相等的情况,可以在@zerkms的解决方案前添加if条件。 使用“ceil”将向上舍入小数,并正确排序十进制数。
usort($data, function($a, $b) 
      {
        return ceil($a[$_GET['sortby']] - $b[$_GET['sortby']]); 
      });

从PHP7及更高版本开始,没有理由调用ceil()或使用减法。每次都应该使用太空船运算符(三路比较运算符)--它甚至可以正确地将数字字符串作为数字进行比较。 - mickmackusa

0

作为排序算法,这里是一个很好的例子,可以对多维数组进行排序,而不使用任何内置的PHP函数。

$multiarr = array('0'=>array(
        "hashtag" => "a7e87329b5eab8578f4f1098a152d6f4",
        "title" => "Flower",
        "order" => 3),

'1' => array(
        'hashtag' => "b24ce0cd392a5b0b8dedc66c25213594",
        "title" => "Free",
        "order" => 2),
'2' => array('hashtag' => 'e7d31fc0602fb2ede144d18cdffd816b',
        'title' => 'Ready',
        'order' => 1
    ));

排序函数:

function multisort(&$array, $key) {
    $valsort = array();
    $ret = array();
    reset($array);
    foreach ($array as $ii => $va) {
        $valsort[$ii] = $va[$key];
    }
    asort($valsort);
    foreach ($valsort as $ii => $va) {
        $ret[$ii] = $array[$ii];
    }
    $array = $ret;
}

multisort($multiarr, "order");

:输出:

Array
 (
[2] => Array
    (
        [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
        [title] => Ready
        [order] => 1
    )

[1] => Array
    (
        [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
        [title] => Free
        [order] => 2
    )

[0] => Array
    (
        [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
        [title] => Flower
        [order] => 3
    )

)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接