PHP每次刷新都能加载不同的新数据方法

有很多app,你刷新时每次都会加载新的内容,就好像永远刷不完一样。而不是像一般我们做的翻页,按照第1,2,3页这样加载数据,自己想了一个方法,仅供参考。

$page = $_GET['page']?:1;
$uniqueNo = str_replace(".","_",getIp())."_".getDeviceid;//生成一个用户唯一标识
if ($page == 1){
   cache("loadPage_".$cate."_".$uniqueNo,null);//如果是第一页,清空已加载页码缓存,$cate表示列表查询时需要的参数,针对特定条件查询生成已加载页码缓存
}

$loadPage = cache("loadPage_".$cate."_".$uniqueNo)?:[];//取出已加载过的页码 是一个数组
$count = Db::name(tablename)->where($where)->cache(1800)->count();//查询符合条件的总数据量
$limit = 10;
$totalPage = ceil($count/$limit);//计算出总页数
$page = getRandPage($totalPage,$loadPage,$page);
if(!$page){//说明数据加载完    
    $list = [];
}else{
    //正常业务处理
    $start = ($page-1)*$limit;
    $list = Db::name(tablename)->where($where)->limit($start,$limit)->select();
    .
    .
    .
    //将当前页码加入到已加载页码缓存中
    array_push($loadPage,$page);
    cache("loadPage_".$cate."_".$uniqueNo,$loadPage,1800);
}
/**
 * @param $totalPage 总页数
 * @param $usedPage 已加载过的页码数组
 * @param int $isFirst 是否第一页
 * @return bool|int
 */
function getRandPage($totalPage,$usedPage,$isFirst = 1){
    //如果只有1页
    if($totalPage == 1 && $isFirst==1){
        return 1;
    }
    //如果可用页码已取完,返回false,说明数据已结束
    if(count($usedPage) >= $totalPage){
        return false;
    }
    //如果是第一次翻页,去掉最后一页 防止用户在第一次加载时取到最后一个页码,而最后一页数据量又不满一页(如:10条)的情况,造成后续不能翻页
    if($isFirst == 1){
        $randPage = rand(1,$totalPage-1);
    }else{
        $randPage = rand(1,$totalPage);
    }

    if(!in_array($randPage,$usedPage)){
        return $randPage;
    }else{
        return getRandPage($totalPage,$usedPage,$isFirst);
    }
}

以上方法也有一个缺点,就是当用户翻了很多页之后,已加载页码缓存数组中会有很多个元素,在使用getRandPage函数获取随机未使用的页码时,随机产生的页码可能会存在已加载页码缓存数组中,这样就要再循环一次,多次循环可能会产生一些耗时问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

P P PHP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值