You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单类别广告按时间轮换需求:现有PHP代码功能调整

解决方案

核心思路

  • 针对第一类别:动态获取该类别下的广告总数,基于小时周期计算轮换偏移,仅对该类别内广告应用轮换排序;
  • 针对第二类别:直接使用固定排序(如发布时间倒序),不做轮换处理。

代码实现(内嵌数据库查询版)

function getRotatingOrderByCategory($category_id) {
    // 连接数据库(请替换为你的实际数据库配置)
    $db = new PDO('mysql:host=你的主机地址;dbname=你的数据库名', '用户名', '密码');
    
    // 获取第一类别下的广告总数(假设广告表为`ads`,类别字段为`category_id`)
    $stmt = $db->prepare("SELECT COUNT(*) FROM ads WHERE category_id = 1");
    $stmt->execute();
    $items_count = $stmt->fetchColumn();

    // 第一类别无广告时返回默认排序
    if ($items_count === 0) {
        return "ORDER BY date_added DESC";
    }

    // 计算小时级轮换偏移
    $hours = floor(time() / 3600);
    $rotation = $hours % $items_count;

    // 按类别生成对应排序逻辑
    if ($category_id == 1) {
        return "ORDER BY CASE
            WHEN (id % {$items_count}) = {$rotation} THEN 0
            WHEN (id % {$items_count}) > {$rotation} THEN (id % {$items_count})
            ELSE (id % {$items_count} + {$items_count})
        END ASC, date_added DESC";
    } else {
        return "ORDER BY date_added DESC";
    }
}

// 使用示例
$order_by_category_1 = getRotatingOrderByCategory(1); // 第一类别轮换排序
$order_by_category_2 = getRotatingOrderByCategory(2); // 第二类别固定排序

代码实现(分离数据库查询版)

如果不想在排序函数内直接操作数据库,可提前获取第一类别广告数再传入:

function getRotatingOrder($category_id, $first_category_count = 0) {
    if ($category_id == 1 && $first_category_count > 0) {
        $hours = floor(time() / 3600);
        $rotation = $hours % $first_category_count;
        return "ORDER BY CASE
            WHEN (id % {$first_category_count}) = {$rotation} THEN 0
            WHEN (id % {$first_category_count}) > {$rotation} THEN (id % {$first_category_count})
            ELSE (id % {$first_category_count} + {$first_category_count})
        END ASC, date_added DESC";
    } else {
        return "ORDER BY date_added DESC";
    }
}

// 调用前先查询第一类别广告数
$db = new PDO('mysql:host=你的主机地址;dbname=你的数据库名', '用户名', '密码');
$stmt = $db->prepare("SELECT COUNT(*) FROM ads WHERE category_id = 1");
$stmt->execute();
$first_count = $stmt->fetchColumn();

$order_by_1 = getRotatingOrder(1, $first_count);
$order_by_2 = getRotatingOrder(2);

关键说明

  1. 动态数量获取:通过数据库查询自动获取第一类别广告总数,无需手动指定;
  2. 类别隔离逻辑:通过category_id参数区分两类广告的排序规则,互不干扰;
  3. 边界容错:第一类别无广告时自动 fallback 到默认排序,避免异常。

内容的提问来源于stack exchange,提问作者Yekta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 20:55:04