我需要帮助以几种逻辑对数组进行排序
[
{
"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"
}
]
答案 0 :(得分:1)
很少有解决方案:
$products->sortBy(function($product) {
return [$product->param1, $product->param2];
});
这将首先按param2排序集合,然后按param1排序
$posts = $posts->sortBy(function($post) {
return sprintf('%-12s%s', $post->column1, $post->column2);
});
$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');