Multi-tiered Comment Replies: Display and Storage

前端 未结 5 1806
夕颜
夕颜 2021-02-02 04:18

So I\'m trying to create a comment system in which you can reply to comments that are already replies (allowing you to create theoretically infinite threads of replies). I want

5条回答
  •  独厮守ぢ
    2021-02-02 05:05

    You should consider nesting your comments in a tree - I'm not that well familiar with data trees, but I can accomplish something relatively easy - I'm open to any suggestions (and explanations) for optimizing the code - but an idea would be something like this:

    id = $id;
                $this->parent = $parent;
                $this->content = $content;
            }
    
            public function addChild( Comment $obj )
            {
                $this->childs[] = $obj;
            }
    
        }
    
    
        /** Function to locate an object from it's id to help nest the comments in a hieraci */ 
        function locateObject( $id, $comments )
        {
            foreach($comments as $commentObject)
            {
                if($commentObject->id == $id)
                    return $commentObject;
    
                if( count($commentObject->childs) > 0 )
                    return locateObject($id, $commentObject->childs);
    
            }
        }
    
        /** Function to recursively show comments and their nested child comments */
        function showComments( $commentsArray )
        {
            foreach($commentsArray as $commentObj)
            {
                echo $commentObj->id;
                echo $commentObj->content;
    
                if( count($commentObj->childs) > 0 )
                    showComments($commentObj->childs);
            }
        }
    
        /** SQL to select the comments and order dem by their parents and date */
        $sql = "SELECT * FROM comment ORDER BY parent, date ASC";
        $result = $mysqli->query($sql);
    
        $comments = array();
    
        /** A pretty self-explainatory loop (I hope) */
        while( $row = $result->fetch_assoc() )
        {
    
            $commentObj = new Comment($row["id"], $row["parent"], $row["content"]);
    
            if($row["parent"] == 0)
            {
                $comments[] = $commentObj;
                continue;
            }
    
            $tObj = locateObject($row["parent"], $comments);
            if( $tObj )
                $tObj->addChild( $commentObj );         
            else
                $comments[] = $commentObj;
    
        }
    
    
    
        /** And then showing the comments*/
        showComments($comments);
    
    
    ?>
    

    I hope you get the general idea, and I'm certain that some of the other users here can provide with some experienced thoughts about my suggestion and helt optimize it.

提交回复
热议问题