单类别广告按时间轮换需求:现有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);
关键说明
- 动态数量获取:通过数据库查询自动获取第一类别广告总数,无需手动指定;
- 类别隔离逻辑:通过
category_id参数区分两类广告的排序规则,互不干扰; - 边界容错:第一类别无广告时自动 fallback 到默认排序,避免异常。
内容的提问来源于stack exchange,提问作者Yekta
相关产品推荐
相关产品推荐

