0

データ:

$players = array(
    new Player('psycketom'),
    new Player('stackexchanger'),
    new Player('max')
);

通常、配列内のすべてのオブジェクトから何かを取得するには、 / を使用する必要があります。

foreach ($players as $player)
{
    var_dump( $player->score );
}

しかし、それは反復的なタスクであるため、これらの架空の線に沿って何かにショートカットする方法はありますか (?) :

var_dump( every( $players )->score );

every( $players )->score += 40;

でそのような機能を見たことがないので、実装する方法はありますか?

メイン言語としてを使用して質問しましたが、しないは質問の2番目の部分を表しています.どの言語がそのような、または少なくとも同様の速記をサポートしていますか?

4

2 に答える 2

2

したがって、PHP はこの「すぐに使用できる」ものをサポートしていないことは間違いありません (ただし、以下を参照してください)。私が知っている最初の言語は、Objective-C (まあ、少なくとも CoreFoundation ライブラリ) です。NSArrays およびその他のセットには、特定のメソッドをすべてのメンバーに対して実行するように (1 行で) 指示するメソッドがあります。さらに (少なくとも私にとっては) クールなのは、「キーパス」の概念と、NSArray などによるキーパスのサポートです。例; それぞれが親を持ち、順番に「名前」を持つ「人」の配列があるとしましょう:

arrayOfNames = [peopleArray valueForKeyPath:"parent.name"];

arrayOfNames は、すべての親の名前の配列になりました。

PHP に最も近いのはarray_map です。これは、無名関数と一緒に使用して、非常に迅速に何かをまとめることができます。

逸話かもしれませんが、実行するステートメントが1つしかない場合、ループ構造に中括弧は必要ないことを覚えておく必要があります。したがって、より洗練されたソリューションはこれと競合する必要があります。

foreach($players as $p) $p->score += 40;

そして、そこにいる OOP ファンのためのより深い解決策について言及します... 配列の代わりにコレクション オブジェクトを操作する場合、世界はこのようなものであなたのカキです。頭に浮かぶ最も単純な概念は、php のマジック__call()メソッドです。メンバーを繰り返し処理し、ユーザーにその呼び出しを行うのはどれほど簡単でしょうか? より詳細に制御するには、反復用にいくつかの異なる戦略を実装できます (1 つは変換用、もう 1 つはフィルター用などです。基本的に、返されるものは違います)。したがって、理論的には、いくつかの異なる反復子クラスを作成し、「メイン」コレクション クラスにいくつかのメソッドを実装して、そのうちの 1 つを取得することができます。これらのメソッドは、コンテンツで事前に初期化されます。

$players->transform()->addScore(40);

ここで、transform() は、__call() 手法を使用する「配列を返さない」反復子のインスタンスを返します。

この時点で空が開け始め、述語を受け取り、オブジェクトのサブセットの別のコレクションを返すフィルター反復子の作成を開始できます。次のような構文が可能です。

// send flyer to all parents with valid email address
$parentsPredicate = new Predicate('email');
$players->filteredByPredicate($parentsPredicate)->each()->email($fyler_email_body);
于 2012-08-31T06:58:01.660 に答える
1

あなたができること:

var_dump(array_map(function($el){return $el->score;}, $players));

array_walk($players, function($el) {$el->score += 40;});
于 2012-08-31T06:53:15.413 に答える