有条件地排序以均匀分布记录

Conditionally sorting for an even distribution of records

假设我在一个 Item 模型中有 10 个 Eloquent 模型记录(为简单起见,表示为 JSON):

[
  {id: 1, name: 'Item 1', featured: false},
  {id: 2, name: 'Item 2', featured: true},
  {id: 3, name: 'Item 3', featured: false},
  {id: 4, name: 'Item 4', featured: false},
  {id: 5, name: 'Item 5', featured: false},
  {id: 6, name: 'Item 6', featured: false},
  {id: 7, name: 'Item 7', featured: true},
  {id: 8, name: 'Item 8', featured: false},
  {id: 9, name: 'Item 9', featured: false},
  {id: 10, name: 'Item 10', featured: true},
]

我想首先按 id 升序组织此列表,然后分配记录,这样每两条 featured = false 的记录后面跟着一条 featured = true.[=16= 的记录]

结果如下所示:

[
  {id: 1, name: 'Item 1', featured: false},
  {id: 3, name: 'Item 3', featured: false},
  {id: 2, name: 'Item 2', featured: true},
  {id: 4, name: 'Item 4', featured: false},
  {id: 5, name: 'Item 5', featured: false},
  {id: 7, name: 'Item 7', featured: true},
  {id: 6, name: 'Item 6', featured: false},
  {id: 8, name: 'Item 8', featured: false},
  {id: 10, name: 'Item 10', featured: true},
  {id: 9, name: 'Item 9', featured: false},
]

我如何使用 Eloquent 集合或查询来执行此操作?

这是一个使用集合的有效解决方案(我相信它可以清理很多):

$result = collect($items)->sortBy('id')->partition(function ($i) {
  return $i['featured'];
})->pipe(function ($groups) {
   return $groups->last()->chunk(2)->reduce(function ($carry, $item) use ($groups) {
      $item->each(function ($i) use ($carry) {
         $carry->push($i);
      });
      
      if ($groups->first()->isNotEmpty()) {
         $carry->push($groups->first()->shift());
      }

      return $carry;
   }, collect());
});

查看实际效果 here