[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>
效果:
相關文章
- [thinkPHP5專案實戰_29]前臺首頁和文章搜尋功能完善PHP
- [thinkPHP5專案實戰_30]留言板功能完善PHP
- 前臺怎麼釋出文章?編輯文章?
- git 相關使用文章Git
- java基礎相關文章Java
- 文章評論功能前後端實現方案總結後端
- (一)、文章投票網站的redis相關實現(Java)網站RedisJava
- linux下Oracle RAC檔案系統相關的文章LinuxOracle
- 實戰react技術棧+express前後端部落格專案(9)– 前端管理介面發表文章功能+後端對應介面ReactExpress後端前端
- 二篇關於SAP專案經驗的生活文章
- Maven實戰系列文章Maven
- Medium裡面的react相關文章記錄React
- pbootcms模板內頁如何呼叫相關文章boot
- 網路爬蟲——專案實戰(爬取糗事百科所有文章)爬蟲
- 文章內容分頁功能實現
- .NET微信網頁開發相關文章教程網頁
- [提問交流]如何在OT前臺釋出文章?
- Python實戰專案:打乒乓(原始碼分享)(文章較短,直接上程式碼)Python原始碼
- 部落格專案前臺實現
- Top10: 11 月份最值得關注的 JavaScript 文章和專案JavaScript
- Vue專案中路由動態傳參功能相關實現Vue路由
- PbootCMS文章透過keywords要害字匹配相關boot
- 社群傳送門(其它社群的PHP相關好文章)PHP
- 基於.NetCore開發部落格專案 StarBlog - (22) 開發部落格文章相關介面NetCore
- 資料科學相關文章合集(玉樹芝蘭)資料科學
- 相關前臺跨域的解決方式跨域
- 實戰react技術棧+express前後端部落格專案(5)-- 前後端實現登入功能ReactExpress後端
- 簡單專案實戰flutter(功能篇)Flutter
- apk簽名相關文章APK
- 關於RxJava最友好的文章RxJava
- 關於字串的好文章字串
- Redis 實戰 —— 02. Redis 簡單實踐 - 文章投票Redis
- PHP+Ajax實現文章心情投票功能例項PHP
- 如何使用 Vue3 實現文章目錄功能Vue
- 請問有沒有關於客戶方的專案管理書籍或文章?專案管理
- GAT專案前臺到後臺
- Hadoop大資料實戰系列文章之HDFS檔案系統Hadoop大資料
- flutter_web 實戰之文章列表與詳情FlutterWeb