Laravel-首先按字符串值对数组进行排序,然后按日期排序

时间:2019-08-30 04:26:49

标签: laravel sorting collections

我需要帮助以几种逻辑对数组进行排序

[
  {
    "id": 1,
    "status": "pending",
    "date": "2019-08-01"
  },
  {
    "id": 2,
    "status": "delivered",
    "date": "2019-08-01"
  },
  {
    "id": 3,
    "status": "pending",
    "date": "2019-08-03"
  },
  {
    "id": 4,
    "status": "delivered",
    "date": "2019-08-03"
  },
  {
    "id": 5,
    "status": "delivered",
    "date": "2019-08-02"
  }
]

我要做的是先将数组排序为状态待定显示,然后按降序对它进行排序

我已经测试过使用laravel集合中的sortByDesc,但是该数组看起来只通过1个函数对其进行了排序

$collection = $collection->sortByDesc('date')->sortByDesc(function ($row, $key) {
      if($row['status'] == 'pending'){
         return 1;
      }else{
         return 0;
      }
});

我预期的最终结果如下:

[
  {
    "id": 3,
    "status": "pending",
    "date": "2019-08-03"
  },
  {
    "id": 1,
    "status": "pending",
    "date": "2019-08-01"
  },
  {
    "id": 4,
    "status": "delivered",
    "date": "2019-08-03"
  },
  {
    "id": 5,
    "status": "delivered",
    "date": "2019-08-02"
  },
  {
    "id": 2,
    "status": "delivered",
    "date": "2019-08-01"
  }
]

3 个答案:

答案 0 :(得分:1)

很少有解决方案:

  1. 使用自定义回调并返回数组source
$products->sortBy(function($product) {
            return [$product->param1, $product->param2];
 });
  

这将首先按param2排序集合,然后按param1排序

  1. 使用自定义回调并返回复合属性以对source进行排序
$posts = $posts->sortBy(function($post) {
    return sprintf('%-12s%s', $post->column1, $post->column2);
});
  1. 按第1列对数组进行排序,然后按第2列对数组进行拆分,然后再次合并(未经测试)。
$collection->sortByDesc('date');
$collection->groupBy('status');
$collection->keyBy('status');

编辑:同样,我不确定sortByDesc('date')是否适用于日期字符串。

答案 1 :(得分:0)

您的预期结果可以这样实现。

$sorted = $collection
              ->sortByDesc('date')
              ->sortBy(function ($item) {
                  return 'pending' == $item['status'] ? 0 : 1;
              })
              ->values();

答案 2 :(得分:0)

更准确地说:

      $collection= $collection->sort(
        function ($a, $b) {
            if(($a->status== $b->status) &&($a->status== 'pending')){
                return ($a->date >= $b->date) ? -1 : 1;
            }elseif($a->status== 'pending' && ($a->status!= $b->status)){
                return 1;
            }else{
                return ($a->date <= $b->date) ? 1 : -1;
            }
        }
    );
    $collection= $collection->sortByDesc('status');