$comment) { $reply_phid = $comment->getReplyToCommentPHID(); if (isset($replies[$reply_phid])) { $replies[$reply_phid][] = $comment; unset($comments[$key]); } } // For each top level comment, add the comment, then add any replies // to it. Do this recursively so threads are shown in threaded order. $results = array(); foreach ($comments as $comment) { $results[] = $comment; $phid = $comment->getPHID(); $descendants = $this->getInlineReplies($replies, $phid, 1); foreach ($descendants as $descendant) { $results[] = $descendant; } } // If we have anything left, they were cyclic references. Just dump // them in a the end. This should be impossible, but users are very // creative. foreach ($replies as $phid => $comments) { foreach ($comments as $comment) { $results[] = $comment; } } return $results; } private function getInlineReplies(array &$replies, $phid, $depth) { $comments = idx($replies, $phid, array()); unset($replies[$phid]); $results = array(); foreach ($comments as $comment) { $results[] = $comment; $descendants = $this->getInlineReplies( $replies, $comment->getPHID(), $depth + 1); foreach ($descendants as $descendant) { $results[] = $descendant; } } return $results; } }