本文作者:李洋博客

zblogphp高效随机显示代码,比较完美的解决方案推荐

李洋博客 3个月前 ( 05-20 ) 762 4条评论
zblogphp高效随机显示代码,比较完美的解决方案摘要: 关于zbp的随机显示方案,之前就写过一个教程,当然代码不是我写的,我只是“搬运工”而已,文章链接:zblogphp随机显示文章的教程,其实并不是很完美,然后前些天跟@可风聊天,问了...

关于zbp的随机显示方案,之前就写过一个教程,当然代码不是我写的,我只是“搬运工”而已,文章链接:zblogphp随机显示文章的教程,其实并不是很完美,然后前些天跟@可风聊天,问了下他有没有更好的方案,这不今天比较完美的方案就出来了,而且可以调用某个分类的的随机文章,恩,厉害~佩服。

搬运工.jpg

附上代码:

function GetRandArticles($count , $where = '' , $real = ''){
    global $zbp;
    
    //判断一下网站文章总数是不是少于需要的随机数量,少就直接获取文章并返回,
    if ($zbp->cache->all_article_nums <= $count) return GetList($count);
    
    //固定一下要调用的文章数量,如果第一次调用后的数量不够数的话,还得再次调用自身函数,得需要这个值
    if (!$real) $real = $count;
    
    //定义全局变量,因为可能会需要调用多次本函数,所以得把获得得文章存在全局变量中
    if (!isset($GLOBALS['articles'])) $GLOBALS['articles'] = array();
    
    //定义全局变量,同上。将已获得得文章ID存此变量
    if (!isset($GLOBALS['randid'])) $GLOBALS['randid'] = array();
    //sql where 判定,如果要限定某一个作者,或者说分类,就可以在这里修改
    $where = $where?:array(array('=', 'log_Type', '0') , array('=' , 'log_Status' , '0'));
    
    //获取所有文章最大ID和最小ID
    $sql = $zbp->db->sql->Select($zbp->table['Post'] , "MIN(log_ID),MAX(log_ID)" , $where);
    $res = $zbp->db->Query($sql);
    $limits = array_values($res[0]);
    
    //生成上面最大ID和最小ID之间随机数
    $ids = $or = array();
    for ($i = 0; $i < $count; $i++) {
        $ids[] = mt_rand($limits[0],$limits[1]);
    }
    
    //拼接sql or 语句。
    foreach ($ids as $id) {
        //检查一下获得的文章ID有没有在之前就获取到过,防止有重复的ID
        if (array_search($id,$GLOBALS['randid']) !== false) continue;
        $or[] = array('log_ID',$id);
        $GLOBALS['randid'][] = $id;
    }
    
    //也可能本次获取的随机数都是和之前获取的全部重复了,所以得判断一下
    if ($or) {
        $w = $where;
        $ors = array('array',$or);
        $w[] = $ors;
        //获取文章
        $res = $zbp->GetArticleList('*' , $w);
        //将获得得文章存在全局变量中
        $GLOBALS['articles'] = array_merge($GLOBALS['articles'],$res);
    }
    //计算一下,本次获取的文章数量有没有够数。
    if (($count = $real - count($GLOBALS['articles'])) > 0) {
        //不够数继续调用自身函数再次获取
        return GetRandArticles($count , $where , $real);
    }else{
        //够数,返回文章对象数组
        return $GLOBALS['articles'];
    }
}

调用代码:

//参数1:文章数量,10为调用的文章数量
foreach (GetRandArticles(10) as $article) {
    echo $article->Title;
}
//参数2:$where 数组 (可选),获取分类ID为21下的随机10篇文章
GetRandArticles(10,array(array('=', 'log_Type', '0') , array('=' , 'log_Status' , '0'),array('=' , 'log_CateID' , 21)))

PS:

可风原文还有另外一种调用方式,我只是节选了适合我的。虽说官方并不赞同也没有给出更完美的解决方案,但是某些时候随机显示文章还是有用处的。

文章投稿或转载声明:

来源:可风网版权归原作者所有,转载请保留出处。本站文章发布于 3个月前 ( 05-20 )
温馨提示:文章内容系作者个人观点,不代表李洋个人博客对其观点赞同或支持。

分享到:
赞(5

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

发表评论

快捷回复:

评论列表 (有 4 条评论,762人围观)参与讨论
网友昵称:心灵博客
心灵博客 游客2019-05-26椅子 回复 Firefox 50.0 Windows 7 x64
博主这个主题是自己做的吗?
网友昵称:李洋博客
李洋博客 博主2019-05-27 回复 Sogou Explorer Windows 7 x64
@心灵博客 当然了,有什么疑问么?
网友昵称:新闻头条
新闻头条 游客2019-05-22沙发 回复 Google Chrome 63.0.3239.132 Windows 7
文章不错支持一下,非常喜欢
网友昵称:李洋博客
李洋博客 博主2019-05-23 回复 Sogou Explorer Windows 7 x64
@新闻头条 谢谢支持