Recently work needs to complete a comment on the function of the Internet to find a few comment system display style. Finally, referring to the comment system such as "multi-Talk" and "Chang-yan", I realized a simple comment system using PHP language. It also records the implementation of two ways (recursive and non-recursive), and analyzes the pros and cons of the two approaches, but how the front-end is implemented does not show.
First design the database as follows:
Create TABLE ' comments ' (' id ' bigint unsigned NOT null auto_increment, ' arc_id ' bigint unsigned not null COMMENT ' article ID ', ' use r_id ' bigint unsigned NOT null COMMENT ' user ID ', ' comment_id ' bigint unsigned NOT null DEFAULT ' 0 ' COMMENT ' reply to the ID of a comment ', ' conte NT ' varchar (255) NOT null default ' COMMENT ' comment or reply content ', ' add_time ' timestamp not null default Current_timestamp COMMENT ' Tim Add time ', PRIMARY key (' ID '), key ' arc_id ' (' arc_id ')) engine=innodb DEFAULT Charset=utf8 COMMENT ' article comment form ';
Create the test data as follows:
The implementation scenario is as follows (implemented on the thinkphp framework):
1. Recursive method
Pros: The code is simple to implement, and if the level of comment is fixed at 5 levels, it is recommended that this approach be used so that the front end is simple to achieve with this kind of data result.
Disadvantage: If the level of the comment is not fixed, the front end will not be able to display the comment information, and if the hierarchy is too much, it will greatly consume memory, but also the most fatal is to query the database every time, the performance will be greatly reduced.
/** * @param $arc _id Article ID * @param int $comm _id Comment ID * @param array $result * @return Array */function getcommlist ($arc _id, $comm _id = 0, & $result = Array ()) { //Get comment list if (empty ($arc _id)) {return array ();} $_where = "arc_id = {$arc _id} and comment_id = {$comm _id}"; $res = M (' comments ')->where ($_where)->order (' Add_time DE SC ')->select (); if (empty ($res)) {return array ();} foreach ($res as $cm) {$THISARR = & $result []; $cm ["_child"] = Getcommlist ($arc _id, $cm [' id '], $THISARR); $thisArr = $cm;} return $result;}
Some of the data are shown below:
2, non-recursive method (stack mode implementation)
Advantage: Query database only once, the performance is good. can implement N-level comments, the front end can also be very good display
Cons: The code is slightly more complex and the front-end comment is more complex for fixed-level reviews.
/** * @param $arc _id Article 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) { //The data of the comment is first put into storage (that is, comment_id=0) if ($v [' comment_id '] = = 0) {$v [' _ Level '] = 0; Set number of levels $v[' _root '] = $v [' id ']; Identity Review Idarray_push ($stack, $v); Into the stack unset ($res [$k]);}} while (!empty ($stack)) {$node = Array_pop ($stack); Stack $datalist[] = $node; foreach ($res as $_k=>$_v) {if ($_v[' comment_id ') = = $node [' id ']) {$_v[' _level '] = $node [' _ Level ']+1; Set number of levels $_v[' _root '] = $node [' _root ']; Identity Review Idarray_push ($stack, $_v); Into the stack unset ($res [$_k]);}}} return $dataList;}
The results of the data display are as follows: