Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中对象数组的复杂排序_Php_Arrays_Sorting_Object_Forum - Fatal编程技术网

PHP中对象数组的复杂排序

PHP中对象数组的复杂排序,php,arrays,sorting,object,forum,Php,Arrays,Sorting,Object,Forum,我需要对论坛程序中的一组对象进行排序,并进行多次比较。每个帖子(主线程或回复)都是一个类帖子的实例。我需要按照timestartchanged属性(用于bump)对主线程进行排序,然后按照timeStarted属性(最早的优先)对它们下面的回复进行排序。我的目标是按照它在论坛表中显示的确切顺序对数组进行排序。简单地说,排序和显示如下: - Main thread - Reply - Reply - Reply - Reply - Reply

我需要对论坛程序中的一组对象进行排序,并进行多次比较。每个帖子(主线程或回复)都是一个类帖子的实例。我需要按照timestartchanged属性(用于bump)对主线程进行排序,然后按照timeStarted属性(最早的优先)对它们下面的回复进行排序。我的目标是按照它在论坛表中显示的确切顺序对数组进行排序。简单地说,排序和显示如下:

- Main thread
   - Reply
      - Reply
   - Reply
   - Reply
      - Reply
         - Reply
- Main thread
等等
我看过usort之类的,但是我不知道比较函数是如何工作的。哦,每个对象都有一个属性isReply,如果它不是回复,则该属性被设置为0;如果它是回复,则该属性被设置为它是回复的帖子的线程ID。每个对象都有一个属性TID,它是其线程ID(唯一)。我还有一个名为numReplies的属性,它显示一条消息有多少个直接回复(当然,回复也会有自己的numReplies,它显示分配给该回复的回复数量,等等)

我已经把显示部分放下,从数据库中获取信息,我只是不确定最有效的排序方法。谢谢你的帮助

编辑:这是我启动该类的代码,我排除了从数据库中获取数据的部分,但只知道Post的所有适用实例都被分配到各自的对象数组中(回复在replyObjs中,main在mainsObjs中,等等):


您正在对一个对象数组进行排序,因此,除非您希望按数组键进行排序,否则不会真正帮助您

您必须在对象数组上循环,访问对象属性,并按照您想要的顺序重建数组。如果没有看到一些代码,就不可能给出更多细节

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

如果您有一个类“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;
}

我将用我当前的代码编辑问题,减去我自己排序失败的尝试。我看不到任何代码。你在用PHP编程吗?你有一个属性“parentID”或类似的东西吗?我刚刚发布了我到目前为止的代码,它只是一个基本类的开始和一些数据库调用,之前我忽略了排序尝试。是的,我有一个parentID属性,名为isReply,如果它不是回复,则设置为0;如果它是回复,则设置为直接父消息的线程ID(TID)。顺便说一下,“getStickyObjs”和“getMainsObjs”调用只是我遗漏的函数,因为它们只是根据消息是stickyObjs、mainsObjs还是reply从数据库中获取消息,然后根据它们的信息为每个消息实例化一个Post对象,并将其应用于三个对象数组(stickyObjs、mainsObjs或replyObjs)中的一个。@Adam:那么类的类别是1条注释?“类别”相对于“评论”代表什么。我想你应该再仔细考虑一下。我在我的答案中进行了编辑,您可能希望在数据库中进行排序。我将在我的回答中添加更多细节。
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;
}