getAllAd(); if ($data) { $arr = []; foreach ($data as $k => $item) { if (in_array($position_code, explode(',', $item['show_position']))) { array_push($arr, $item['id']); }; } return implode(',', $arr); } else { return ''; } } /** * 第二步:遍历所有计划,过滤出匹配用户ID的计划 * @param $position_code * @param $uid * @param $channel_id * @return array */ public function getMatchPlan($position_code, $uid, $channel_id) { $match_plans = []; $plans = $this->getAllPlan($position_code); if ($plans) { $plan_arr = explode(',', $plans); foreach ($plan_arr as $k => $ad_id) { // $ad_id => 计划ID // 这里需要获取用户渠道ID AD:JU:计划id:渠道号 $redis_key = AdConstants::AD_JU_KEY . $ad_id . $channel_id; $uid_str = Redis::instance()->get($redis_key); if($uid_str){ $uid_arr = implode(',', $uid_str); if(in_array($uid, $uid_arr)){ array_push($match_plan, $ad_id); } } } } return $match_plans; } /** * 第三步:通过计划查找合适的素材 * @param $position_code 位置编号 * @param $uid 用户ID * @param $channel_id 渠道ID * @return array */ public function getMatchAdMaterial($position_code, $uid, $channel_id) { $matchPlans = $this->getMatchPlan($position_code, $uid, $channel_id); $banner_ad_ids = []; // $screen_material_ids = []; //插屏 if ($matchPlans) { foreach ($matchPlans as $k => $ad_id) { // $ad_id => ad_manage 对应ID $redis_key = AdConstants::AD_P_KEY.$ad_id; $redis_data = Redis::instance()->get($redis_key); if($redis_data){ $obj = json_decode($redis_data); if ($obj->ad_type == '1') { //插屏广告 if ($obj->state) { array_push($screen_material_ids, $ad_id); } } else { //Banner广告 if ($obj->state) { array_push($banner_ad_ids, $ad_id); } } } } } $data = []; switch ($position_code) { case AdConstants::AD_P_XQ: //书籍详情页 $data = $this->_getMultiMaterial($banner_ad_ids,$uid,AdConstants::AD_P_XQ); break; case AdConstants::AD_P_ZG: //追更页 $data = $this->_getMultiMaterial($banner_ad_ids,$uid,AdConstants::AD_P_ZG); break; case AdConstants::AD_P_YDYDB: //阅读页底部 $data = $this->_getMultiMaterial($banner_ad_ids,$uid,AdConstants::AD_P_YDYDB); break; case AdConstants::AD_P_ZJYD: //最近阅读 $data = $this->_getOneMaterial($banner_ad_ids,$uid,AdConstants::AD_P_ZJYD); break; case AdConstants::AD_P_SJ: //书架 $data = $this->_getOneMaterial($banner_ad_ids,$uid,AdConstants::AD_P_SJ); break; case AdConstants::AD_P_YDYCD: //阅读页顶部菜单下拉 $data = $this->_getOneMaterial($banner_ad_ids,$uid,AdConstants::AD_P_YDYCD); break; case AdConstants::AD_P_YDY_ZJ_A: //阅读页中间1 $data = $this->_getOneMaterial($banner_ad_ids,$uid,AdConstants::AD_P_YDY_ZJ_A, 'screen'); break; default: //阅读页中间2 AdConstants::AD_P_YDY_ZJ_B $data = $this->_getOneMaterial($banner_ad_ids, $uid,AdConstants::AD_P_YDY_ZJ_B,'screen'); } return $data; } /** * 获取单个Banner 素材 * @param array $banner_ad_ids * @param $uid * @param string $type * @param int $position * @return array */ private function _getOneMaterial(array $banner_ad_ids, $uid, $position = 0, $type = 'banner') { // 打点广告ID $dot_ad_ids = implode(',', $banner_ad_ids); $rst = []; // 从缓存哩取数据 $data = $this->getMaterial($type); if($data){ $idx = rand(0, count($data)-1); $item = $data[$idx]; $rst = [ 'material_id' =>$item->id, 'img_url' =>$item->img_url, 'link_url' =>$item->link_url, 'ad_ids' => $dot_ad_ids, 'position' => $position, 'user_id' => $uid ]; } return $rst; } /** * @param array $ad_ids * @param $uid * @param int $position * @param string $type * @return array */ private function _getMultiMaterial(array $ad_ids, $uid, $position = 0, $type = 'banner') { // 打点广告ID $dot_ad_ids = implode(',', $ad_ids); $rst = []; $data = $this->getMaterial($type); if (count($data)) { for ($i = 0; $i < 3; $i++) { $idx = rand(0, count($data) - 1); $item = $data[$idx]; array_push($rst, [ 'material_id' => $item->id, 'img_url' => $item->img_url, 'link_url' => $item->link_url, 'ad_ids' => $dot_ad_ids, 'position' => $position, 'user_id' => $uid ]); } } return $rst; } /** * @param $type banner | screen * @return array */ public function getMaterial($type) { $rst = []; $material_ids = Redis::instance()->get(AdConstants::AD_SC_IDS); if ($material_ids) { $arr = explode(',', $material_ids); foreach ($arr as $k => $id) { $material_str = Redis::instance()->get(AdConstants::AD_M_KEY . $id); if ($material_str) { $obj = json_decode($material_str); if ($type == 'banner') { if ($obj->ad_type == '0') { // Banner广告 array_push($rst, $obj); } } else { if ($obj->ad_type == '1') { //插屏广告 array_push($rst, $obj); } } } } } return $rst; } public function getAllAd() { $rst = []; $ad_ids = Redis::instance()->get(AdConstants::AD_P_IDS); if ($ad_ids) { $arr = explode(',', $ad_ids); foreach ($arr as $k => $id) { $ad_str = Redis::instance()->get(AdConstants::AD_P_KEY . $id); if ($ad_str) { $obj = json_decode($ad_str); if ($obj->show_starttime <= time() && $obj->show_endtime >= time()) { array_push($rst, $obj); } } } } return $rst; } }