したがって、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);