需求描述:
1.将运营编辑自己维护的 不固定条数的运营数据 插入到信息流中;
2.运营数据不限制条数,且每条运营数据都会有一个"位置序号"字段, 需要按照这个"位置序号"字段的值将该条数据插入到信息流中的这个位置;
思路:
运营数据不确定条数,不确定位置. 那么就涉及到运营数据会插入到多页的情况. 还要保证每条插入到信息流中的运营数据,位置正确. 所以每条运营位数据在插入的时候,它所要插入的位置就要根据已经插入的运营数据的数量,做调整. .
考虑可以将待插入的所有运营位数据按照插入位置做一个从小到大的排序. 然后计算出每个运营位数据在执行插入的时候,需要插入到哪一页数据中.
在信息流接口中,再根据当次请求的页码,将从数据库查询出的分页数据,再插入当前页中需要插入的运营位数据;
代码实现:
/**
* 将需要插入到信息流中的维护位数据按指定插入顺序从小到大,分页排好
* @param $sugData
* @param $size
* @param $maxPage
* @return array
*/
function pageSugData($sugData,$size,$maxPage){
//先将维护位数据按排序字段 从小到大排序
$sugDataIndex = array_column($sugData,'index');
array_multisort($sugDataIndex,SORT_ASC,$sugData);
$pageSug = [];
$sugDataCount = 0;
for($i=1;$i<=$maxPage;$i++){
$pageMaxIndex = $i * $size;
$pageSug[$i] = [];
foreach ($sugData as $k => $sugDataItem) {
if($sugDataItem['index'] <= $pageMaxIndex + $sugDataCount){
$pageSug[$i][] = $sugDataItem;
$sugDataCount++;
unset($sugData[$k]);
continue;
}
break;
}
}
return $pageSug;
}
/**
* 计算当前页中的 每条待插入 数据的整体偏移量
* @param $page
* @param $size
* @param $pageSugData
* @return int
*/
function getOffset($page,$size,$pageSugData){
//当前页之前已经存在的数据总条数 (数据库查询数据 + 已经插入的维护位数据)
$offset = 0;
for($j=1;$j<$page;$j++){
$offset = $offset + count($pageSugData[$j]) + $size;
}
return $offset;
}
/**
* 将维护位维护数据按指定位置插入到 数据库查询到的分页数据中
* @param $nowPage
* @param $maxPage
* @param $size
* @param $sugData
* @param $dbDataPage
* @return mixed
*/
function insertSugData($nowPage,$maxPage,$size,$sugData,$dbDataPage){
$pageSugData = pageSugData($sugData,$size,$maxPage);
$offset = getOffset($nowPage,$size,$pageSugData);
//循环当前页的维护位数据, 按指定偏移量,插入指定位置中
foreach ($pageSugData[$nowPage] as $item) {
array_splice($dbDataPage,$item['index']- $offset -1,0,[$item]);
}
return $dbDataPage;
}
$maxPage = 8;//正常分页时总页数
$size = 5;//正常每页数据
//维护位中的数据
$sugData = [
['index'=>5,'title'=>'sug-----5'],
['index'=>2,'title'=>'sug-----2'],
['index'=>25,'title'=>'sug-----25'],
['index'=>9,'title'=>'sug-----9'],
['index'=>19,'title'=>'sug-----19'],
['index'=>29,'title'=>'sug-----29'],
['index'=>13,'title'=>'sug-----13'],
['index'=>16,'title'=>'sug-----16'],
];
//当前页
$nowPage = 3;
//当前页从数据库查询出的数据
$dbDataPage3 = [
['index'=>11,'title'=>'db-11'],
['index'=>12,'title'=>'db-12'],
['index'=>13,'title'=>'db-13'],
['index'=>14,'title'=>'db-14'],
['index'=>15,'title'=>'db-15'],
];
//整合数据
$dbDataPage3 = insertSugData($nowPage,$maxPage,$size,$sugData,$dbDataPage3);
print_r($dbDataPage3);
输出所有信息流数据,验证
//循环多页数据,输出验证
$pageValue = [];
for($i=1;$i<$maxPage;$i++){
$pageValue[$i] = [];
for($k=0;$k<$size;$k++){
$index = ($i - 1) * $size + $k;
$pageValue[$i][] = ['index'=>$index,'title'=>'db_'.strval($index)];
}
$pageValue[$i] = insertSugData($i,$maxPage,$size,$sugData,$pageValue[$i]);
echo 'page-----------------------'.$i.PHP_EOL;
foreach ($pageValue[$i] as $item){
echo $item['index'].'----'.$item['title'].PHP_EOL;
}
}
page-----------------------1
0----db_0
2----sug-----2
1----db_1
2----db_2
5----sug-----5
3----db_3
4----db_4
page-----------------------2
5----db_5
9----sug-----9
6----db_6
7----db_7
8----db_8
13----sug-----13
9----db_9
page-----------------------3
10----db_10
16----sug-----16
11----db_11
12----db_12
19----sug-----19
13----db_13
14----db_14
page-----------------------4
15----db_15
16----db_16
17----db_17
25----sug-----25
18----db_18
19----db_19
page-----------------------5
20----db_20
29----sug-----29
21----db_21
22----db_22
23----db_23
24----db_24
page-----------------------6
25----db_25
26----db_26
27----db_27
28----db_28
29----db_29
page-----------------------7
30----db_30
31----db_31
32----db_32
33----db_33
34----db_34