【问题标题】:How to loop over the query results of a comments system with replies?如何用回复循环评论系统的查询结果?
【发布时间】:2019-04-09 20:04:34
【问题描述】:

我正在尝试显示数据库中的 cmets。一些 cmets 是其他 cmets(父母)的孩子,所以在我的数据库中,我将 parent 字段设置为 null 作为默认值,如果新评论是子评论,我在该字段中插入父评论的 id。

插入工作正常,但我在显示系统方面遇到问题。我尝试在其括号下显示每个子评论,显示我的代码父元素但子元素保持为空。

我已尝试使用print_r 函数来查看数组中是否有数据,它显示数据,我认为我遗漏了某些内容,或者我的代码构造中有一些逻辑错误。

if(is_array($this->comments))
{ 
    $comments = array();
    $parent_array = array();
?>
    <ol>
    <?php   
    foreach($this->comments as $key => $value) {
        if($value['parent'] === 0) {
            $comments[] = $value;
        } else {
            $parent_array['parent'][] = $value;
            $comments[] = $parent_array;
        }
    }
    foreach($comments as $key => $value) {
    ?>
    <div> 
        <li style="color: #dc143c; font-size: 14pt;margin-left: 20px;">
        - <?php echo $value['id']; ?>
        </li>
        <p> <?php echo $value['title'] ; ?></p>
        <p> <?php echo $value['description'] ; ?></p>

    <?php 
    }
}
?>

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    查看了您的代码,我认为您没有很好地对 cme​​ts 和子 cmets 进行分组。试试这个

    <?php    
           $all_comments = [];
    
           foreach($this->comments as $key => $value){
              if($value['parent'] === 0) 
              {
                $all_comments[$value['id']]['comment'] = $value;
              } else {
                $all_comments[$value['parent']]['subcomment'][] = $value;
              }
           }
    
           foreach($all_comments as $comment){
              // display only main comments here
              if(isset($comment['comment'])) {
                ?>
                <div> 
                <li style="color: #dc143c; font-size: 14pt;margin-left: 20px;">
                - <?php echo $comment['comment']['id']; ?>
                </li>
                <p> <?php echo $comment['comment']['title'] ; ?></p>
                <p> <?php echo $comment['comment']['description'] ; ?></p>
    
                <!-- All its sub-comments -->
                <?php
                   if(isset($comment['subcomment'])) {
                       displaySubComment($all_comments, $comment);
                   }
              }
         }
    
         function displaySubComment($all_comments, $comment) 
         {
           foreach($comment['subcomment'] as $subcomment) {
              ?>
              <h3> Sub-Comments </h3>
              <p> <?php echo $subcomment['title'] ; ?></p>
              <p> <?php echo $subcomment['description'] ; ?></p>
              <?php
              // re-iterate over itself, if more comments exist under a comment and display all
              if(array_key_exists($subcomment['id'], $all_comments)) {
                 displaySubComment($all_comments, $all_comments[$subcomment['id']])
              }                
           }
         }
    ?>
    

    【讨论】:

    • 感谢@Jonathan K 的帮助,是的,它起作用了,但是如果评论同时是父母和孩子呢?
    • 我已经更新了答案,它现在应该能够向下迭代到较低的 cmets,沿着层次结构向下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    相关资源
    最近更新 更多