最近有一個需求是這樣,數據庫有電影幾百條,預告片幾百條。之前是倒序排列返回給客戶端,這樣所有客戶端就能看到最新的片子和預告片,電影和預告片是兩個接口。現在由於考慮服務器壓力,決定隨機展現影片和預告片給客戶端,兩個接口合併成一個,按ABABAB這樣返回。我的做法是以用戶id加今年的天數作為隨機種子對電影和預告片進行隨機排序,然後截取亂序後的數組進行交叉合併並進行分頁,再返回給客戶端。這樣的效果是同一用戶在同一天打開的列表是一樣的,而且影片條目不會重複。而不同用戶打開的列表卻不一樣。公司項目用的ThinkPHP3.1,看下代碼
//接口urlhttp://domin.com:8042/Video/v1.php?qt=Videolist&pi=2&ps=20&uid=972124678
class ApiVideolistAction extends Action{
function getData(){
//獲取用戶id,單頁條目數量和第幾頁
$uid = I("get.uid", "0", "intval");
$pageSize = I("get.ps", "20", "intval");
$pageNum = I("get.pi", "1", "intval");
$model1=new Model();
$film=$model1->query("SELECT video_static.sid FROM video_static, category_video WHERE category_video.cid = 4 AND video_static.status = 1 AND category_video.vid = video_static.sid ");
$trailer=$model1->query("SELECT video_static.sid FROM video_static, category_video WHERE category_video.cid = 50 AND video_static.status = 1 AND category_video.vid = video_static.sid ");
$count = count($film) > count($trailer) ? count($film) : count($trailer);
$allPage = ceil($count / $pageSize);
if ($pageNum > 0 && $pageNum <= $allPage) {
$limit_start = ($pageNum - 1) * $pageSize;
} else {
$limit_start = 0;
}
$dayNum=(int)date('z');
//设置隨機種子,只要種子一樣,隨機後的數組就一樣
srand($uid+$dayNum);
//打亂數組
shuffle($film);
shuffle($trailer);
//分頁切數組
$vid_listF=array_slice($film,$limit_start,$pageSize);
$vid_list1F=array_slice($trailer,$limit_start,$pageSize);
//交叉合併數組
$arr = array();
for($i=0;$i < $pageSize; $i++){
array_push($arr,$vid_listF[$i]);
array_push($arr,$vid_list1F[$i]);
}
if (empty($arr)) {
return array(
"resultStatus" => 1,
"allCount" => 0,
"data" => null
);
}
$data = array();
foreach ($arr as $every) {
//這裡用了ThinkPHP的方法根據sid獲取一條數據
$find = D('VideoStatic')->find($every['sid']);
//對數據進行處理的示例
$find['videuri'] = $find['videuri'] ? "http://" . APP_HOST_NAME . ":8042/" . $find['videuri'] : "";
if (empty($find)) { continue; }
$data[] = array_change_key_case($find, CASE_UPPER);
}
$result = array(
"allCount" => $count,
"pageCount" => $allPage,
"pageSize" => $pageSize*2,
"pageIndex" => $pageNum
);
return array(
"resultStatus" => 1,
"pinfo" => $result,
"data" => $data
);
}
}
既然文章名叫PHP隨機,其實PHP隨機最常用的用法是rand(10,13),它會返回最小10,最大13的整數。