简化对array_map中项目的调用方法

时间:2018-07-11 12:33:15

标签: php syntax

假设我们有一个表示知道其名称的实体的类:

class Entity
{
    private $name;
    public function __construct(string $name) { $this->name = $name; }
    public function getName() :string { return $this->name; }
}

,我们有一系列这样的实体:

$entities = [ new Entity('Alice'), new Entity('Bob') ];

我们真正想要的是它们的名称数组,因此我们使用array_map函数:

$names = array_map(
    function($entity) { return $entity->getName(); },
    $entities
);

但是,即使我从闭包中删除了类型提示,但语法对我来说仍然显得庞大,尤其是在了解[ $object, 'methodName' ]闭包语法的情况下。

有没有一种方法可以简化array_map的构造?

2 个答案:

答案 0 :(得分:2)

你的东西对我来说还可以。

唯一可能的解决方案是使用array_column(),但是只有将name声明为public时,该方法才有效:

(PHP版本> = 7.0)

<?php

class Entity
{
    public $name = 'Alice';
    public function __construct(string $name) { $this->name = $name; }
};

$entities = [ new Entity('Alice'), new Entity('Bob') ];

var_dump(array_column($entities, 'name'));

输出

  

array(2){

     

[0] =>

     

string(5)“爱丽丝”

     

[1] =>

     

string(3)“鲍勃”

     

}

https://3v4l.org/VIVPU

答案 1 :(得分:1)

目前没有更短的语法。有两个RFC(https://wiki.php.net/rfc/arrow_functionshttps://wiki.php.net/rfc/short-closures)想要引入简短的闭包,但它们仍处于草稿阶段,很难在php中获得此类功能的2/3多数。在不久的将来,我不希望他们会以这种语言出现。

如果在这种情况下需要更简洁的语法,则可以创建自己的lambda生成器。

function getPropertyLambda($property) {
    return function($item) use ($property) {
        return $item->{'get' . ucfirst($property)}();
    };
}

$names = array_map(getPropertyLambda("name"), $entities);