1

PHPLithiumを使用して埋め込まれた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うまくいけば、リチウムコレクションは並べ替え可能です。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、およびオブジェクトのlithium \ util\Collectionに関するドキュメントを確認してください。DocumentArrayCollection

ジョービーソンによる紹介Collections彼は特にソートについてはカバーしていませんが、読む価値があります(他の記事も)

于 2012-03-27T23:30:33.543 に答える