Комплексная сортировка массива объектов в PHP - PullRequest
0 голосов
/ 18 марта 2011

Мне нужно отсортировать массив объектов для программы форума с несколькими сравнениями. Каждый пост (основная тема или ответ) является экземпляром класса Post. Мне нужно отсортировать основные потоки по их свойству timeLastChanged (для поднятия), а затем отсортировать ответы под ними по их свойству timeStarted (сначала самое старое). Моя цель состояла в том, чтобы отсортировать массив в том порядке, в котором он будет отображаться в таблице форума. Просто сортируется и отображается так:

- Main thread
   - Reply
      - Reply
   - Reply
   - Reply
      - Reply
         - Reply
- Main thread

и т.д.
Я смотрел на usort и тому подобное, но я не могу понять, как функции сравнения будут работать для этого. Да, и у каждого объекта есть свойство isReply, которое устанавливается в 0, если оно не является ответом, и устанавливается в идентификатор потока сообщения, на которое он является ответом, если это ответ. Каждый объект имеет свойство TID, которое является его идентификатором потока (уникальным). У меня также есть свойство 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 голосов
/ 18 марта 2011

Вы сортируете массив объектов, поэтому функции массива PHP на самом деле не помогут вам, если вы не хотите сортировать по ключам массива.

Вам придется перебирать массив объектов, получать доступ к свойствам объектов и перестраивать ваш массив в нужном вам порядке. Не видя часть вашего кода, на самом деле невозможно дать больше деталей.

Поскольку вы извлекаете данные из базы данных, вероятно, лучше выполнить там сортировку.

Если у вас есть класс «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;
}
...