最近有一個需求是這樣,數據庫有電影幾百條,預告片幾百條。之前是倒序排列返回給客戶端,這樣所有客戶端就能看到最新的片子和預告片,電影和預告片是兩個接口。現在由於考慮服務器壓力,決定隨機展現影片和預告片給客戶端,兩個接口合併成一個,按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的整數。