4

配列のように動作する、オブジェクトのコレクションであるオブジェクトがあります。これはデータベースの結果オブジェクトです。次のようなもの:

$users = User::get();
foreach ($users as $user)
    echo $user->name . "\n";

変数は、実装およびインターフェース$usersするオブジェクトです。ArrayAccessCountable

この「配列」をソートおよびフィルタリングしたいのですが、配列関数を使用できません。

$users = User::get();
$users = array_filter($users, function($user) {return $user->source == "Twitter";});
=> Warning: array_filter() expects parameter 1 to be array, object given

この種のオブジェクトをソートおよびフィルタリングするにはどうすればよいですか?

4

2 に答える 2

8

できません。インターフェイスの目的は、ArrayAccess配列用の OOP ラッパーを作成することだけではありません (ただし、そのように使用されることがよくあります)。最初からすべての要素を認識していない可能性があるコレクションへの配列のようなアクセスを可能にすることも目的です。offsetGet()とでリモート プロシージャを呼び出す Web サービス クライアントを想像してくださいoffsetSet()。任意の要素にアクセスできますが、コレクション全体にアクセスすることはできません。これはArrayAccessインターフェイスの一部ではありません。

オブジェクトが(またはTraversableを介し​​て) も実装している場合、少なくともそれから配列を構築できます (仕事をします)。ただし、そのように変換する必要があります。ネイティブの配列関数は配列のみを受け入れます。IteratorIteratorAggregateiterator_to_array

オブジェクトがデータを配列として内部に保存する場合、最も効率的な解決策はもちろん、toArray()この配列を返すメソッドを実装することです (そしてtoArray()、含まれているオブジェクトを再帰的に呼び出すこともできます)。

于 2013-02-17T09:29:44.713 に答える