【问题标题】:Complex sorting of an array of objects in PHPPHP中对象数组的复杂排序
【发布时间】:2011-03-18 01:25:43
【问题描述】:

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

【问题讨论】:

    标签: php arrays sorting object forum


    【解决方案1】:

    您正在对一个对象数组进行排序,因此除非您想按数组键排序,否则 PHP array functions 并不能真正帮助您。

    您必须遍历对象数组并访问对象属性并按照您想要的顺序重建您的数组。如果没有看到您的某些代码,实际上不可能提供更多详细信息。

    当您从数据库中提取数据时,最好在那里进行排序。

    如果您有一个“Article”类,那么它可以有一个“getComments”方法,该方法可以直接执行数据库调用或涉及一些其他类/方法来检索该文章的 cmets。不过,在数据库中排序可能是最好的,因为您也可以在检索它们时对它们进行排序。这就是数据库的作用。

    这是一个空气代码示例。这是一个递归函数。所以要小心。

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

    【讨论】:

    • 我将用我当前的代码编辑问题,减去我自己排序失败的尝试。
    • 我没有看到任何代码。你在用 PHP 编码吗?你有属性“parentID”或类似的东西吗?
    • 我刚刚发布了到目前为止的代码,它只是一个基本的类开始和一些数据库调用到目前为止,我之前遗漏的排序尝试。是的,我有一个 parentID 属性,称为 isReply,如果不是回复,则设置为 0,如果是回复,则设置为直接父消息的线程 ID (TID)。
    • 顺便说一下,“getStickyObjs”和“getMainsObjs”调用只是我遗漏的函数,因为它们只是根据它们是粘性、主要还是回复从数据库中获取消息根据信息为每个对象实例化一个 Post 对象,并将其应用于三个对象数组之一(stickyObjs、mainsObjs 或 replyObjs)。
    • @Adam:那么类类别是 1 条评论? “类别”相对于“cmets”代表什么。我想你可能想再考虑一下。我在我的答案中进行了编辑,您可能想在数据库中进行排序。我会在我的答案中添加更多细节。
    猜你喜欢
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 2021-03-11
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多