《手动推荐》加《自动推荐》商品,如何分页问题

如题,我先描述下业务场景:
  我司 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;
讨论数量: 2

为什么不从数据库设计考虑?多字段权重排序的事情

3周前 评论
浮心 (楼主) 3周前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!