《手动推荐》加《自动推荐》商品,如何分页问题
如题,我先描述下业务场景:
我司 APP 有个营销版块,以瀑布流的形式展示商品。展示的商品分为二种数据:一是手动指定的商品,数量少且不固定,大概 0~30 之间浮动;二是自动推荐的商品,通过简单的筛选展示,比如精选、热卖之类的。
手动指定商品需要优先展示,比如说手动指定了 5 个商品,并且瀑布流一页仅展示 10 个商品,那么第 1 页瀑布流,前面 5 个就是手动指定,往后全是自动推荐的商品,包括后面的分页,全部都是自动推荐的商品。同理,如果手动指定了 15 个商品,那么第 1 页的所有商品,和第 2 页前面 5 个商品都是手动指定的,往后才是自动推荐的。
我尝试写了一个方法,想让大家看看,还有什么可以优化的地方,或者更好的写法
/**
* @param int $page 瀑布流的页码
* @param int $pageSize 每页展示数量
* @param int $manualQuantity 手动推荐的数量
* @return array
*/
function page_offset(int $page, int $pageSize, int $manualQuantity)
{
//手动推荐的余数
$manualRemainder = $manualQuantity % $pageSize;
//手动推荐的总页数
$manualPageCount = floor($manualQuantity / $pageSize) + 1;
//自动推荐分页的 offset 和 limit
$offset = max(0, ($page - $manualPageCount) * $pageSize - $manualRemainder);
$limit = $offset ? $pageSize : max(0, ($page * $pageSize) - $manualQuantity);
return [$offset, $limit];
}
echo implode(PHP_EOL, [
implode("\t", page_offset(1, 10, 0)),
implode("\t", page_offset(2, 10, 0)),
implode("\t", page_offset(3, 10, 0)),
implode("\t", page_offset(1, 10, 3)),
implode("\t", page_offset(2, 10, 3)),
implode("\t", page_offset(3, 10, 3)),
implode("\t", page_offset(1, 10, 14)),
implode("\t", page_offset(2, 10, 14)),
implode("\t", page_offset(3, 10, 14)),
]) . PHP_EOL;
推荐文章: