按asc或desc以外的自定义顺序对Laravel Collection进行排序

dwi*_*wix 1 php laravel laravel-5

我有这个数组作为Laravel Collection:

"data": [
  {
    "id": 863368,
    "reference": "Ref 1",
    "status": 1
  },
  {
    "id": 863391,
    "reference": "Ref 2",
    "status": 2
  },
  {
    "id": 863390,
    "reference": "Ref 3",
    "status": 2
  },
  {
    "id": 863396,
    "reference": "Ref 4",
    "status": 3
  }
];
Run Code Online (Sandbox Code Playgroud)

我需要按status而不是按asc或对其进行排序desc,但是具有状态的记录2应首先在列表上,然后是状态,1然后是状态3

我不知道如何实现这一目标,在此先感谢您。

Fro*_*oxz 5

嗨,有类似的问题,

$final = $collection->sortBy(function($item){
    return array_search($item->status, ['2', '1', '3']);
});
Run Code Online (Sandbox Code Playgroud)

['2', '1', '3'] (状态为2的状态为第一个,因为其位置键为0,只需根据需要更改顺序即可。

或者您可以创建一个array喜欢['2' => 1, '1' => 2, '3' => 3]

使用return $arry_of_order[$item->status];(更快,然后array_search每次调用)

PS:如果您可以按照此处其他人的建议使用DB(MySql),则应坚持使用它, $query->orderByRaw("FIELD(status, '2', '1', '3')")

对于PostgreSQL,请看这里

  • 此解决方案适用于少量收藏。如果集合太大,使用 MySQL 的排序会更好:) (2认同)
  • 我同意,你的解决方案是完全正确的,只是考虑到从查询构建的这个集合的可能性,我觉得要提到这一点 (2认同)