PHP Lithium: сортировка встроенного массива объектов

Я хотел бы отсортировать встроенный объект MongoDB с помощью PHP Lithium. У меня есть модель "Thread", которая выглядит примерно так:

{
   "_id": ObjectId("4f71bf4618b602580f000009"),
   "postings": [
      {text: "a", upvotes: 15, /*...*/},
      {text: "b", upvotes: 23},
      {text: "c", upvotes: 16},
      {text: "d", upvotes: 42}
   ],
   // bla
}

Теперь я хотел бы отсортировать сообщения в зависимости от их голосов. Я уже написал метод, который примерно делает то, что я хочу:

public function postings_sort_by_upvotes($thread) {
    $postings = $thread->postings->to('array');
    usort($postings, function($a, $b) {
                         return ($a['upvotes'] > $b['upvotes'] ? 1 : -1);
                     });
    return $postings;
}

Это работает, но, очевидно, возвращает сообщения в виде простого массива, в то время как несортированные сообщения имеют тип lithium\data\collection\DocumentArray.

Мне действительно нужно бороться с массивом вместо объекта или есть способ, который позволяет мне сортировать их, не теряя исходный тип данных?


person YMMD    schedule 27.03.2012    source источник


Ответы (1)


Объект DocumentArray — это объект Collection, и, надеюсь, Lithium Collections можно сортировать. Вы можете вызвать sort() $collection разными способами:

$collection->sort('field'); //sort naturally by the given field

Или определите пользовательское закрытие:

$collection->sort(function ($a,$b) {
    if ($a == $b) {
        return 0;
    }
    return ($b > $a ? 1 : -1);
});

Проверьте документы на lithium\data\Collection, от которого наследуется DocumentArray, и lithium\util\Collection, объект Collection.

Введение в CollectionsДжо Бисона. Он особо не распространяется о сортировке, но его стоит прочитать (другие статьи тоже)

person Mehdi Lahmam B.    schedule 27.03.2012
comment
Я попытался отсортировать его в своем представлении, выполнив следующее: $thread->postings->sort('upvotes'), но это не удалось с фатальной ошибкой: Неперехваченное исключение «BadMethodCallException» с сообщением «Нет связанного с моделью или необработанного вызова метода sort». в D:\xampp\htdocs\AWF\libraries\lithium\data\Entity.php:191 То, что вы говорите, звучит разумно для меня, а также документы очень ясны, но я все еще не могу вызвать этот метод . Что я делаю не так? - person YMMD; 28.03.2012
comment
Я могу подтвердить, что он работает нормально после запуска вашего собственного кода github.com/UnionOfRAD. /lithium/issues/405#issuecomment-4831856. Убедитесь, что ничто не мешает вашей сущности (до или после создания и т. д.) - person Mehdi Lahmam B.; 30.03.2012
comment
Теперь он работает для меня, так как я вручную скопировал исходный код метода в lithic\util\Collection.php. Понятия не имею почему, но мой код его не содержал, хотя версию 0.10 я скачал всего 19 дней назад. Спасибо за вашу помощь и извините за предоставление такой неуловимой информации. - person YMMD; 30.03.2012
comment
Метод Sort() был представлен в июле 2011 года, до версии 0.10 (github. com/UnionOfRAD/lithium/commit/). Ветка master работает стабильно. Клонируй ;) - person Mehdi Lahmam B.; 30.03.2012