36

次のような単純なクラスがあるとします。

class MyClass {
  private $_prop;
  public function getProp() {return $this->_prop;}
  [....]
}

今、私がしたいことは、 ( )MyClassのオブジェクトの配列から $_prop の配列を取得することです。もちろん、これは次のようなコードで実行できます。MyClass$objs

$props = array();
foreach ($objs as $obj) {
    $props[] = $obj->getProp();
}

ただし、この方法でフォーマットされている場合は特に、いくつかの行を引用する必要があります(そのようなフォーマットを使用する必要があります)。質問は、array_map を使用してこれを行うことが可能かどうかです。1 つの方法は create 関数を使用することですが、php ではそれがあまり好きではありません (php のラムダは少なくともぎこちなく、正しく理解している場合、そのパフォーマンスは評価されたコードのパフォーマンスに似ていますが、パフォーマンスはここでは重要ではありません)。私はかなりの検索に疲れており、決定的な答えを見つけることができませんでした. でも、それは仕方ないかなという気持ちもあります。のようなことを試しarray_map(array('MyClass', 'getProp'), $objs)ましたが、メソッドが静的ではないため機能しません。

編集:php 5.3を使用しています。

4

1 に答える 1

35

PHP 5.3 では、次のことができます。

$props = array_map(function($obj){ return $obj->getProp(); }, $objs);

(無名関数を参照)

もちろん、for要素ごとに 1 つの関数呼び出しがあるため、これはループを使用するよりも遅くなりますが、これはあなたが望むものに最も近いと思います。

または、PHP 5.3 より前のバージョンでも機能し、スタイル ガイドラインにより適している可能性があります。

function map($obj) {
    return $obj->getProp();
}

$props = array_map('map', $objs);

または (再び PHP 5.3 に戻って) 次のようなラッパー関数を作成することもできます (ただし、これが最も遅い可能性だと思います)。

function callMethod($method) {
    return function($obj) use ($method) {
        return $obj->{$method}();
    };
}

$props = array_map(callMethod('getProp'), $objs);
于 2011-07-27T07:05:42.210 に答える