有条件地排序以均匀分布记录
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。
假设我在一个 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。