【问题标题】:Disqus-like comment thread logic in PHPPHP 中类似 Disqus 的评论线程逻辑
【发布时间】:2012-05-09 19:29:04
【问题描述】:

我正在尝试像 Disqus 一样创建一个评论线程。我无法在 PHP 中设置逻辑以显示 cmets,以便可以回复每条评论,然后这些 cmets 将保持相互连接。

这是我的 MySQL cmets 表:

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 是一列,表示 cmets 正在讨论的父项。

如果我从我的数据库中提取所有带有 item_id=1 的 cmets,那么我不确定如何对它们进行线程化以使 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
  }
}

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

【问题讨论】:

  • 魔术关键字是recursion。当然,为此,您首先必须了解递归... :o)
  • 感谢 Deceze,我认为递归是关键,但不确定如何根据我的参数设置一个简单的演示。你能帮忙吗?

标签: php mysql if-statement foreach


【解决方案1】:

简单的演示,不一定是最佳的,但可以工作:

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

这假设顶级 cmets 没有 replied_to_id (null)。您的示例带有评论 1 回复 1 没有多大意义。

【讨论】:

  • 谢谢!是的,评论1 回复1 毫无意义,只是为了我的簿记。如果您更容易在没有这个的情况下制作递归示例,我将非常感谢您看看它会是什么样子。谢谢,
  • 嗯,对不起?上面给出的示例演示了递归输出线程 cmets,忽略当前的 1 = 1 并假设注释 1 具有 replied_to_idnull
  • 另一件事是我正在使用 codeigniter 和他们的 foreach 速记:&lt;? foreach(...):?&gt;。我不确定如何将该代码包装在您的 displayComments() 函数中。我使用这个速记的原因是因为实际上我不仅仅是在做一个简单的echo $comment,还有相当多的 HTML 正在呈现。
  • &lt;? foreach (..): ?&gt; 是非常好的替代 PHP 语法,与 CI 无关。您可以在 CI 中完美地运行上述内容。您可能应该将函数放入帮助程序而不是视图模板中,但想法是相同的。是的,你的真实代码可能会更复杂,但重点是让你理解递归。你可以自己解决剩下的问题。
  • 谢谢,如果可能,最后一件事?从您的评论中我不确定您的递归演示是否会产生 ALL 我上面指定的所需输出?还是仅限于comment_id!=replied_to_id的cmets?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 2013-12-12
  • 2014-03-28
相关资源
最近更新 更多