在文章详情页面需要展示相关文章列表,该列表使用过当前文章的关键词来获取的;
当前文章的关键词可能不止一个,因此需要查询所有文章是否具有该关键词,如果有则将该文章相关信息储存到数组中;
这样遍历出来文章可能重复,因为需要对该数组中的文章进行去重;
去重的方法有很多,这里使用对数组降维的处理方法;
由于获取的文章信息也是数组,所以储存相关文章的列表就是二维数组;
将其将为以为数组,文章信息数组拼接成字符串作为数组元素,如果文章重复,则具有相同的字符串;
再使用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>
效果: