最近工作中需要完成一個評論的功能,上網查找了幾個評論系統的展示樣式。最后參考“多說”和“暢言”等評論系統,自己使用PHP語言實現了一個簡單的評論系統。并記錄了兩種方式(遞歸方式和非遞歸方式)的實現過程,以及分析兩種方式的優缺點,但前端如何實現就沒有展現了。
首先設計數據庫如下:
create table `comments`(
`id` bigint unsigned not null AUTO_INCREMENT,
`arc_id` bigint unsigned not null COMMENT '文章id',
`user_id` bigint unsigned not null COMMENT '用戶id',
`comment_id` bigint unsigned not null DEFAULT '0' COMMENT '回復某個評論的id',
`content` varchar(255) not null DEFAULT '' COMMENT '評論或回復的內容',
`add_time` timestamp not null DEFAULT CURRENT_TIMESTAMP COMMENT '添加時間',
PRIMARY KEY (`id`),
KEY `arc_id` (`arc_id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '文章評論表';
創建測試數據如下:

具體實現方案如下(在ThinkPHP框架上實現):
1、遞歸方式
優點:實現代碼簡單,而且如果評論的層級固定在5個層次一下的話,建議使用該種方法,這樣前端通過這種數據結果實現簡單。
缺點:如果評論的層級沒有固定的話,前端將無法展示評論信息了,而且如果層級太多的話,將會極大的消耗內存,更要命的是每次遞歸都得查詢數據庫,性能將大大的降低。
/**
* @param $arc_id 文章id
* @param int $comm_id 評論id
* @param array $result
* @return array
*/
function getCommlist($arc_id, $comm_id = 0, $result = array()){ //獲取評論列表
if(empty($arc_id)){
return array();
}
$_where = "arc_id = {$arc_id} AND comment_id = {$comm_id}";
$res = M('comments')->where($_where)->order('add_time DESC')->select();
if(empty($res)){
return array();
}
foreach ($res as $cm) {
$thisArr = $result[];
$cm["_child"] = getCommlist($arc_id,$cm['id'],$thisArr);
$thisArr = $cm;
}
return $result;
}
部分數據展示如下:

2、非遞歸方式(堆棧方式實現)
優點:只查詢一次數據庫,性能較好。可以實現n層級的評論,前端也能很好的展示
缺點:代碼稍微復雜,對于固定的層級評論,前端展示評論較為復雜。
/**
* @param $arc_id 文章id
* @return array
*/
public function getCommlist($arc_id){
if(empty($arc_id)){
return array();
}
$res = M('comments')->where(array('arc_id'=>$arc_id))->order('add_time ASC')->select();
$dataList = $stack = array();
if($res){
foreach($res AS $k=>$v){ //先將評論的數據進行入庫(即comment_id=0)
if($v['comment_id'] == 0){
$v['_level'] = 0; //設置層級數
$v['_root'] = $v['id']; //標識評論id
array_push($stack,$v); //入棧
unset($res[$k]);
}
}
while(!empty($stack)){
$node = array_pop($stack); //出棧
$dataList[] = $node;
foreach($res as $_k=>$_v){
if($_v['comment_id'] == $node['id']){
$_v['_level'] = $node['_level']+1; //設置層級數
$_v['_root'] = $node['_root']; //標識評論id
array_push($stack,$_v); //入棧
unset($res[$_k]);
}
}
}
}
return $dataList;
}
數據展示效果如下:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:- PHP+Mysql無刷新問答評論系統(源碼)
- PHP Ajax實現頁面無刷新發表評論
- PHP Ajax實現頁面無刷新發表評論
- 使用AngularJS和PHP的Laravel實現單頁評論的方法
- php實現評論回復刪除功能
- ThinkPHP上使用多說評論插件的方法
- PHP抓取淘寶商品的用戶曬單評論+圖片+搜索商品列表實例
- PHP仿qq空間或朋友圈發布動態、評論動態、回復評論、刪除動態或評論的功能(上)
- 詳解WordPress中調用評論模板和循環輸出評論的PHP函數