我需要为具有多重比较的论坛程序排序一组对象。每个帖子(主线程或回复)都是Post类的实例。我需要通过timeLastChanged属性(用于碰撞)对主线程进行排序,然后按照timeStarted属性(最早的属性)对它们下面的回复进行排序。我的目标是按照它在论坛表中显示的确切顺序对数组进行排序。简单地,排序和显示如下:
- Main thread
- Reply
- Reply
- Reply
- Reply
- Reply
- Reply
- Main thread
等。
我看过usort之类的东西,但我无法想象比较函数如何才能做到这一点。哦,并且每个对象都有一个属性isReply,如果它不是一个回复,则设置为0,并设置为帖子的线程ID,如果是回复则回复。每个对象都有一个属性TID,它是它的线程ID(唯一)。我还有一个名为numReplies的属性,它显示了一条消息有多少直接回复(然后,当然,回复将有自己的numReplies,显示为该回复分配了多少回复等)。
我已经将显示部分关闭并从数据库中获取信息,我只是不确定最有效的排序方式。谢谢你的帮助。
编辑:这是我启动类的代码,我排除了从数据库中获取数据的部分,但只知道Post的所有适用实例都分配给它们各自的对象数组(回复是在replyObjs中,主管在mainsObjs等中):
class Category {
public $title;
public $majCatID;
public $catID;
public $modLevel;
public $postingLevel;
public $hostedByUID;
public $order;
public $shortName;
public $info;
public $stickyObjs;
public $mainsObjs;
public $replyObjs;
public $orderedObjs;
private $database;
public function __construct($catID) {
$this->database = new TBDatabase;
$result = $this->database->getIntRow(CAT_TABLE, 'catID', $catID);
$row = $this->database->fetchAssoc($result);
$this->title = $row['title'];
$this->majCatID = $row['majCatID'];
$this->catID = $row['catID'];
$this->modLevel = $row['modLevel'];
$this->postingLevel = $row['postingLevel'];
$this->hostedByUID = $row['hostedByUID'];
$this->order = $row['order'];
$this->shortName = $row['shortName'];
$this->info = $row['info'];
}
public function sortPosts() {
$table = $this->shortName."_threads";
$this->getStickyObjs();
$numStickies = count($this->stickyObjs);
$this->getMainObjs();
$numMains = count($this->mainsObjs);
$this->getReplyObjs();
$numReplies = count($this->replyObjs);
}
答案 0 :(得分:0)
您正在对一组对象进行排序,因此除非您想按数组键排序,否则PHP array functions并不会真正帮助您。
您必须遍历对象数组并访问对象属性并按所需顺序重建阵列。没有看到你的一些代码,就不可能提供更多细节。
当您从数据库中提取数据时,最好在那里进行排序。
如果你有一个“Article”类,那么它可以有一个方法“getComments”,它可以直接进行数据库调用,或者涉及一些其他类/方法来检索该文章的注释。虽然,数据库中的排序可能是最好的,因为您可以在检索它们时对它们进行排序。这就是数据库所做的事情。
这是一个空气代码示例。这是一个递归函数。所以要小心。
public function getComments($id, $sort)
{
$sorted = array();
$comments = $this->getChildren($id, $sort); // make getChildren return null if no children records.
if (!is_null($comments) && count($comments) > 0)
{
foreach ($comments as $comment)
{
$sorted[$comment['id']] = $comment;
$sorted[$comment['id']]['children'] = $this->getComments($comment['id'], $sort);
}
}
else
{
$sorted = $comments;
}
return $sorted;
}