最近工作中需要完成一個評論的功能,上網找了幾個評論系統的展示樣式。最後參考「多說」和「暢言」等評論系統,自己使用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開發文章評論系統的詳細內容。更多資訊請關注PHP中文網其他相關文章!