2012-03-27 16 views
1

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種類あったが、明らかにそれは、プレーンな配列として転記を返します。私はすでに大体、私が何をしたいんどの方法を書きました。

オブジェクトの代わりに配列に苦労する必要がありますか、元のデータ型を失うことなく並べ替える方法がありますか?

答えて

4

DocumentArrayオブジェクトは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\CollectionCollectionオブジェクトを あなたは$collectionさまざまな方法でsort()を呼び出すことができます。 Joe Beeson著

Introduction to Collections

+0

私はこれを私のビューでソートしようとしました: '$ thread-> postings-> sort( 'upvotes')'でも失敗します。致命的なエラー:_Uncaught例外 'BadMethodCallException'メッセージがあります 'モデルバインドされていないか、または処理されていないメソッド呼び出し' sort'がありません。 ' D:\ xampp \ htdocs \ AWF \ libraries \ lithium \ data \ Entity.php:191_あなたの言うことは私には合理的で、文書も非常にはっきりしていますが、私はまだこの方法を呼び出すことができません。私は間違って何をしていますか? – YMMD

+0

自分のコードhttps://github.com/UnionOfRAD/lithium/issues/405#issuecomment-4831856を実行した後、正常に動作することを確認できます。あなたのエンティティ(作成前または作成後など)に何も干渉しないようにしてください。 –

+0

私はこのメソッドのソースコードを手動でlithium \ util \ Collection.phpにコピーしていますので、私にとってはうまくいきます。理由は分かりませんが、コードには含まれていませんでしたが、19日前にバージョン0.10をダウンロードしました。そのような情報を提供することにご協力いただきありがとうございます。 – YMMD