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 来做到这一点?一种方法是使用 create 函数,但我不太喜欢在 php 中这样做(php 中的 lambdas 至少很尴尬,如果我理解正确,它的性能就像 evaled 代码的性能一样,但性能在这里无关紧要)。我已经厌倦了搜索,未能找到任何明确的答案。但我有种感觉,这是不可能的。我试过类似的东西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循环慢,因为每个元素都有一个函数调用,但我认为这最接近你想要的。

或者,它也适用于 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 回答