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