在所有数组成员

时间:2016-05-10 13:42:36

标签: php arrays callback

这可能是一个愚蠢的问题,它的方便而不是功能。

假设我们有班级:

class A { 
    public function getId() {
       return rand(0,100); //For simplicity's sake
    }
}

我们假设我们有一组A类型的对象,例如$array = [ new A(), new A(), new A() ];

通常,如果我想将所有对象的数组转换为其ID数组,我可以执行以下操作:

$idArray = array_map(function ($a) { return $a->getId(); }, $array);

然而,这让我有一种强烈的欲望来简化这个(我经常使用它)。我想要一个像以下的功能:

$idArray = magic_array_map('getId', $array);

我的问题是,有没有办法通过提供函数名而不是实际的回调来调用array_map(或类似的函数)?类似于array_map('count', $array)的东西,而不是strlen提供成员方法名称。

简而言之,是否有内置PHP的方法或者我必须实现自己的array_map来添加此功能?

4 个答案:

答案 0 :(得分:3)

为什么不制作自己的功能并将其传递给array_map()?

class A {
  public function getId() {
    return rand(0,100); //For simplicity's sake
  }
}

$array = [ new A(), new A(), new A() ];

function getId(A $object) {
  return $object->getId();
}

$ids = array_map('getId', $array);
print_r($ids);

答案 1 :(得分:1)

从我的观点来看,一个优雅的解决方案是创建一个Container类,里面有一个map方法。类似的东西:

class A { 
    public function getId() {
       return rand(0,100); //For simplicity's sake
    }
}

class Container
{
    protected $elements;

    public function __construct($elements = array())
    {
        $this->elements = $elements;
    }

    public function map($method)
    {
        return array_map(function ($element) use ($method) {
            return $element->$method();
        }, $this->elements);
    }
}

$container = new Container([new A(), new A(), new A()]);

var_dump($container->map('getId'));

结果如下:

array(3) { [0]=> int(70) [1]=> int(32) [2]=> int(90) }

答案 2 :(得分:1)

一种解决方案是将技术php call class function by string name (see final code snippet)应用于将其映射到数组的函数:

function apply_member_function(string $method_name, array $array) :array {
    return array_map(function ($ob) {return $ob->$method_name();}, $array);
}

用法:

$array_of_as = [ new A(), new A(), new A() ];
$array_of_ids = apply_member_function('getId', $array_of_as);

答案 3 :(得分:0)

您可以创建自己的帮助函数来执行您想要的操作。

my_map_function($callback, $array) {
    return call_user_func_array(callback, $array);
}

my_callback_function($array) {
  //TODO
}

main() {
  $array = [1, 2, 3];
  $array = my_map_function('my_callback_function', $array);
}

像这样;)

这里有更多information