1

我很想使用 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类型。

我真的需要处理数组而不是对象,还是有一种方法可以让我在不丢失原始数据类型的情况下对它们进行排序?

4

1 回答 1

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继承,以及lithium\util\Collection,该Collection对象。

乔比森的介绍Collections。他没有特别介绍排序,但值得一读(也有其他文章)

于 2012-03-27T23:30:33.543 回答