[thinkPHP5專案實戰_28]前臺文章"相關文章"的功能完善

騎著程式碼去流浪發表於2017-11-12

在文章詳情頁面需要展示相關文章列表,該列表使用過當前文章的關鍵詞來獲取的;

當前文章的關鍵詞可能不止一個,因此需要查詢所有文章是否具有該關鍵詞,如果有則將該文章相關資訊儲存到陣列中;

這樣遍歷出來文章可能重複,因為需要對該陣列中的文章進行去重;

去重的方法有很多,這裡使用對陣列降維的處理方法;

由於獲取的文章資訊也是陣列,所以儲存相關文章的列表就是二維陣列;

將其將為以為陣列,文章資訊陣列拼接成字串作為陣列元素,如果文章重複,則具有相同的字串;

再使用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>
效果:



相關文章