【问题标题】:Sort array by mutiple fields (closest to number)按多个字段排序数组(最接近数字)
【发布时间】:2017-11-02 14:13:46
【问题描述】:

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

所以我有一个这样的数组:

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 你能举个例子吗?

标签: php arrays sorting


【解决方案1】:

试试这个:

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
        )

)

它是这样工作的:它比较totals,但如果它们相同,它比较entryentrys的3000之差的绝对值。

eval.in demo

【讨论】:

  • @user2344408 如果数组中有其他元素的总数不同,请告诉我,以便我更新答案。
  • 是的,我实际上有一个数组,可以说 100+,而且总数可能不一样
  • @user2344408 啊,好的,我将更新我的答案以先对总列排序,然后再对条目列进行排序:)
  • 谢谢!你是最棒的:)
  • @user2344408 total 应该升序还是降序排序?顺便说一句,您可能想更新您的问题:)
猜你喜欢
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多