최근 직장에서 댓글 기능을 완성해야 해서 온라인에서 댓글 시스템의 여러 표시 스타일을 검색했습니다. 마지막으로 "Duosuo", "Changyan"과 같은 댓글 시스템을 참조하여 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!