我希望使用PHP Lithium对嵌入的MongoDB对象进行排序。我有一个模型“线程”,看起来几乎像这样:
{
"_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
类型。
我是否真的需要与数组而不是对象斗争,还是有办法允许我对它们进行排序而不会丢失原始数据类型?
答案 0 :(得分:4)
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
继承的文档和Collection
Collections
对象的文档。
Joe Beeson lithium\util\Collection到{{1}}。他没有特别介绍排序,但值得一读(其他文章也是如此)