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

来源:互联网 发布:儿童识字软件 编辑:程序博客网 时间:2024/04/30 20:30

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

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

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

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

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

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

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

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

Article控制器操作方法:

<?phpnamespace 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>
效果:



原创粉丝点击