PHP中对象数组的复杂排序

时间:2011-03-18 01:25:43

标签: php arrays sorting object forum

我需要为具有多重比较的论坛程序排序一组对象。每个帖子(主线程或回复)都是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);
        }

1 个答案:

答案 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;
}