$resource_list 数据格式:
$ad_list数据格式:
$resources_list = collection($resources_list)->toArray();
$resources_num = count($resources_list);
if($ad_list['count'] && $resources_num) {
foreach($ad_list['ad_list'] as $k => $v){
$ad_list['ad_list'][$k]['type'] = -1;//用来标示这是一条广告
}
$cycle_num = ceil($resources_num / 3);//每3个数据插一条广告
$seg = array_chunk($resources_list, $cycle_num);//共将资源分成几个小段
$tmpdata = [];
foreach($seg as $k => $v){
if($ad_list['count'] > $cycle_num && ($k == $cycle_num - 1) ){
//当广告数多于资源块数时,资源已经循环完了,则取剩下的所有广告
$left_ad = array_slice($ad_list['ad_list'], $k);
$tmpdata[] = array_merge($v, $left_ad);
}else{
$tmpdata[] = array_merge($v, [$ad_list['ad_list'][$k]]);//每个段一个广告
}
}
if(!empty($tmpdata)){
unset($ad_list, $resources_list);
$resources_list = $tmpdata;
unset($tmpdata);
}
}
原理是正确的,但在合并数据时出了点小问题,注意看:$tmpdata[] = array_merge($v, [$ad_list['ad_list'][$k]); 这一句,每次循环时,$tmpdata[]的索引都会加1,导致最终结果为$tmpdata[0], $tmpdata[1]……这样子,并不是我们想要的结果。
答案:
$t = array_merge($v, [$ad_list['ad_list'][$k]);
$tmpdata = array_merge($tmpdata, $t); |