PHP Lithium: сортировка массива встроенных объектов
Я хотел бы отсортировать встроенный объект 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 ответ
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);
});
Проверьте документы на литий \ данные \ сборник, из которого DocumentArray
наследует, а литий \ утилит \ коллекция, Collection
объект.
Введение в Collections
Джо Бисон. Он не рассматривает сортировку особенно, но это стоит прочитать (другие статьи тоже)