J'ai récemment eu besoin de remplir une fonction de commentaire au travail et j'ai recherché en ligne plusieurs styles d'affichage du système de commentaires. Enfin, en référence aux systèmes de commentaires tels que "Duosuo" et "Changyan", j'ai implémenté un système de commentaires simple en utilisant le langage PHP. Le processus de mise en œuvre des deux méthodes (récursive et non récursive) est enregistré et les avantages et inconvénients des deux méthodes sont analysés, mais la manière dont le front-end est implémenté n'est pas montrée.
Concevez d'abord la base de données comme suit :
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 '文章评论表';
Créez les données de test comme suit :
Le le plan d'implémentation spécifique est le suivant (Implémenté sur le framework ThinkPHP) :
1. Méthode récursive
Avantages : Le code d'implémentation est simple, et si le niveau de commentaires est fixé à moins de 5 niveaux, il est recommandé de Utilisez cette méthode pour que le front-end puisse transmettre ce résultat de données. Simple à mettre en œuvre.
Inconvénients : si le niveau des commentaires n'est pas fixe, le front-end ne pourra pas afficher les informations des commentaires, et s'il y a trop de niveaux, cela consommera beaucoup de mémoire. Ce qui est plus terrible, c'est qu'à chaque récursion. doit interroger la base de données et les performances seront considérablement réduites.
/** * @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; }
Une partie des données est présentée ci-dessous :
2. 🎜>Avantages : La base de données n'est interrogée qu'une seule fois et les performances sont meilleures. Les commentaires de niveau N peuvent être réalisés, et le front-end peut également bien les afficher
Inconvénients : Le code est légèrement compliqué pour les commentaires de niveau fixe, l'affichage frontal des commentaires est plus compliqué.
/** * @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; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!