PHP Lithium: сортировка массива встроенных объектов - PullRequest
1 голос
/ 28 марта 2012

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

{
   "_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 типа.

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

1 Ответ

4 голосов
/ 28 марта 2012

A DocumentArray объект - Collection, и, надеюсь, Литиевые Коллекции можно сортировать. Вы можете позвонить 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);
});

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

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

...