PHP中的Disqus类评论线程逻辑

时间:2012-04-30 02:38:26

标签: php mysql if-statement foreach

我正在努力制作像Disqus这样的评论主题。我在PHP中设置逻辑时遇到问题,以显示注释,以便人们可以回复每条评论,然后这些评论将保持相互联系。

这是我的MySQL评论表:

comment_id  comment  item_id  replied_to_id  time
 1           hello1    1          1         1:00pm
 2           hello2    1          1         2:00pm
 3           hello3    1          3         3:00pm
 4           hello4    2          4         4:00pm
 5           hello5    1          2         2:00pm
 6           hello6    1          3         6:00pm

item_id是一个列,表示评论正在讨论的父项目。

如果我使用item_id=1从我的数据库中提取所有评论,那么我不确定如何对其进行处理,以使comment_idreplied_to_id匹配得恰当。例如,comment_id=2应与comment_id=1匹配。

这是我的PHP:

<?foreach($comments as $row){
  if($row->comment_id==$row->replied_to_id){
    echo $row->comment."-".$row->time; //desired output: hello1-1:00pm    
      foreach($comments as $sub_row){
        if($row->comment_id!=$sub_row->replied_to_id){
           echo $sub_row->comment."-".$sub_row->time;// desired output: hello2-2:00pm
             foreach($comments as $sub_sub_row){
                if($row->comment_id!=$sub_sub_row->replied_to_id){
                  echo $sub_sub_row->comment."-".$sub_sub_row->time;// desired output: hello5-5:00pm  
                }
             } 
        }
     }          
  }
  else{
    echo $row->comment."-".$row->time;   // desired output: hello3-3:00pm
  }
}

这看起来不错。必须有更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:1)

简单的演示,不一定是最优的,但有效:

function displayComments(array $comments, $parentId = null) {
    foreach ($comments as $comment) {
        if ($comment['replied_to_id'] == $parentId) {
            echo $comment['comment'];
            displayComments($comments, $comment['id']);
        }
    }
}

这假设顶级评论没有replied_to_idnull)。回复1的评论1的示例没有多大意义。