[thinkPHP5项目实战_28]前台文章"相关文章"的功能完善

[thinkPHP5项目实战_28]前台文章"相关文章"的功能完善

在文章详情页面需要展示相关文章列表,该列表使用过当前文章的关键词来获取的;

当前文章的关键词可能不止一个,因此需要查询所有文章是否具有该关键词,如果有则将该文章相关信息储存到数组中;

这样遍历出来文章可能重复,因为需要对该数组中的文章进行去重;

去重的方法有很多,这里使用对数组降维的处理方法;

由于获取的文章信息也是数组,所以储存相关文章的列表就是二维数组;

将其将为以为数组,文章信息数组拼接成字符串作为数组元素,如果文章重复,则具有相同的字符串;

再使用php的array_unique方法去重重复字符串;然后将该数组每个字符串恢复成文章信息数组;

这样储存文章列表恢复了原来的二维数组,然后循环输出到模板上:

Article控制器操作方法:


<?php
namespace app\index\controller;
class Article extends Basic
{
    public function index()
    {
            $id=input('artid');//在文章列表页点击进入获取传过来的文章的id值
            db('article')->where('artid', $id)->setInc('click');//click字段自增1,setInc第二个参数为空则默认自增1
                //根据文章id联表查询该文章的栏目名称,获取该文章的信息
            $arts=\think\Db::name('article')->alias('a')->join('cate c','c.ID = a.cateid','LEFT')->field('a.keywords,a.title,a.content,a.time,a.click,a.artid,a.cateid,c.catename,a.pic')->find($id);
                //使用limit方法查询该栏目的上一篇文章的id值
            $prev= \think\Db::name('article')->where('artid','<',$id)->where('cateid','=',$arts['cateid'])->order('artid desc')->limit(1)->value('artid');
                //使用limit方法查询该栏目的下一篇文章的id值
            $next= \think\Db::name('article')->where('artid','>',$id)->where('cateid','=',$arts['cateid'])->order('artid asc')->limit(1)->value('artid');
            $this->assign('arts',$arts);
            $this->assign('prev',$prev);
            $this->assign('next',$next);
            $ralateres=$this->ralate($arts['keywords']);//调用ralate方法传递参数关键词
            $this->assign('ralateres',$ralateres);
          return $this->fetch('article');
    }


   //相关文章获取

   

public function ralate($keywords){
    $arr=explode(',', $keywords);//将获取的关键词转化为数组
    $ralateres=array();
    //根据关键词遍历文章数据库获取具有该关键词的文章(可能会获取到重复的文章)
    foreach ($arr as $k => $v) {
        $map['keywords']  = ['like','%'.$v.'%'];
        //从数据库中获取具有该关键词的所有文章
        $artres= \think\Db::name('article')->order('artid desc')->where($map)->limit(10)->field('artid,title,time')->select();
        $ralateres=array_merge($ralateres,$artres);//两数组合并为一个数组(将新获取的文章插入到之前的文章数组中)
        $ralateres=$this->arr_unique($ralateres);//数组去重(文章去重)
    }
    return $ralateres;  
}


    /**相关文章数组去重函数

     * @param  [type]

     * @return [type]

     */

    public function arr_unique($arr2D){
        //将二维数组转化为一维数组
        foreach ($arr2D as $v) {
            $v=join(',',$v);
            $temp[]=$v;//每篇文章的信息成了一个字符串
        }
 
        $temp=array_unique($temp);//去重,去除重复的文章信息
        //再恢复成二维数组
        foreach ($temp as $k => $v) {
            $temp[$k]=explode(',', $v);
        }
 
        return $temp;
 
    }
}



文章详情页的模板输出:

<div class="sidebar-module sidebar-module-inset">
    <h4>相关文章:</h4>
    <ol class="list-unstyled">
      <li class="msgarticle">
          {volist name="ralateres" id="vo"}
          <p><a  href="{:url('article/index',array('artid'=>$vo[0]))}">{$vo.1}</a>  ({$vo.2|date="Y-m-d H:i:s",###})</p>
          {/volist}
        </li>
    </ol>
</div>


效果:


20171112014547996.gif


原文链接:https://blog.csdn.net/weixin_36185028/article/details/78509785


追梦猪网站致力于前端分享申明:本站内容搜集整理而来请勿商业用途,仅供交流所用,如若侵犯您的权益请邮件站长进行删除!

文明浏览请勿传播非法内容