2012-03-27 2 views
1

Я хотел бы отсортировать встроенный объект MongoDB с использованием PHP Lithium. У меня есть модель «тема», которая выглядит почти так:PHP Lithium: Сортировка массива встроенного объекта

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

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

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

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

ответ

4

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); 
}); 

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

a Introduction до Collections от Joe Beeson. Он не охватывает сортировку особенно, но стоит прочитать (другие статьи тоже)

+0

Я попытался отсортировать его в своем представлении, сделав это: '$ thread-> postings-> sort ('upvotes')', но он не работает фатальная ошибка: _Uncaught exception «BadMethodCallException» с сообщением «Без привязки модели или необработанного метода' sort'. ' в D: \ xampp \ htdocs \ AWF \ libraries \ lithium \ data \ Entity.php: 191_ То, что вы говорите, кажется разумным для меня, а также документы очень ясны, но я все еще не могу назвать этот метод. Что я делаю не так? – YMMD

+0

Я могу подтвердить, что он работает нормально, после запуска вашего собственного кода https://github.com/UnionOfRAD/lithium/issues/405#issuecomment-4831856. Убедитесь, что ничто не мешает вашему объекту (до или после создания и т. Д.) –

+0

Теперь он работает для меня, когда я скопировал исходный код метода вручную в литиевый \ util \ Collection.php. Я понятия не имею, почему, но мой код не содержал его, хотя я загрузил версию 0.10 всего 19 дней назад. Спасибо за вашу помощь и извините за предоставление такой неуловимой информации. – YMMD