按多个字段(最靠近数字)对数组进行排序

4

如何按照两个(一个)不同的值对数组进行排序?

我有一个类似这样的数组:

array(
   array(
      'id' => 10,
      'total' => 38,
      'entry' => 400
   ),
   array(
      'id' => 4,
      'total' => 34,
      'entry' => 3100
   ),
   array(
      'id' => 2,
      'total' => 34,
      'entry' => 3150
   ),
   array(
      'id' => 8,
      'total' => 34,
      'entry' => 2980
   ),
);

这个数组已经按照 total 键排序,但是它们在 total 上的值都相同。因此,我需要按照 entry 来确定谁最接近 3000。

编辑

这个数组应该首先按照 total 然后按照 entry 排序,因为 entry 只是用来区分谁是最好的。

所以这个数组应该长成这样:

array(
  array(
      'id' => 10,
      'total' => 38,
      'entry' => 400
  ),
  array(
      'id' => 8,
      'total' => 34,
      'entry' => 2980
   ),
   array(
      'id' => 4,
      'total' => 34,
      'entry' => 3100
   ),
   array(
      'id' => 2,
      'total' => 34,
      'entry' => 3150
   )
);

使用usort函数,通过比较abs($v1-3000)和abs($v2-3000)来排序。 - splash58
@splash58,你能展示一个例子吗? - MariusD
1个回答

2

试试这个:

usort($arr, function ($a, $b) {
    if ($a['total'] == $b['total']) { // Only compare on entry when the totals are the same.
        return abs($a['entry'] - 3000) > abs($b['entry'] - 3000);
    }
    return $a['total'] < $b['total'];
});

print_r($arr);

输出:

Array
(
    [0] => Array
        (
            [id] => 2
            [total] => 35
            [entry] => 3150
        )

    [1] => Array
        (
            [id] => 8
            [total] => 34
            [entry] => 2980
        )

    [2] => Array
        (
            [id] => 4
            [total] => 34
            [entry] => 3100
        )

    [3] => Array
        (
            [id] => 6
            [total] => 34
            [entry] => 3250
        )

    [4] => Array
        (
            [id] => 3
            [total] => 32
            [entry] => 3400
        )

)

以下是翻译的结果:它的工作原理如下:它将比较“total”,但如果它们相同,它会比较“entry”的绝对值与3000之间的差异。

eval.in演示


如果您的数组中有其他元素不具有相同的总和,请告诉我,以便我可以更新我的答案。 - Ethan
是的,我实际上有一个数组,假设它有100个以上,而且可能不是同样的总数。 - MariusD
@user2344408 哦,好的,我会更新我的答案,先按总列排序,然后再按条目列 :) - Ethan
@user2344408,我已更新我的答案,先比较总数,然后再比较条目。请检查 :) - Ethan
看起来很好也很简单!非常感谢,看起来它在这里也能工作 :D - MariusD
显示剩余2条评论

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