PHP Lithium:对嵌入式对象数组进行排序

时间:2012-03-27 21:44:06

标签: php sorting mongodb mongodb-php lithium

我希望使用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类型。

我是否真的需要与数组而不是对象斗争,还是有办法允许我对它们进行排序而不会丢失原始数据类型?

1 个答案:

答案 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}}。他没有特别介绍排序,但值得一读(其他文章也是如此)