[thinkPHP5项目实战_28]前台文章"相关文章"的功能完善
文章栏目103910390
发布时间:2019-12-28 10:47:06

概述

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

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

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

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

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

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

再使用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>

效果:

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