2016-05-10 61 views
1

這可能是一個愚蠢的問題,它的一個方便而不是功能。在所有陣列成員上調用對象成員函數

假設我們有類:

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來添加此功能?

回答

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

+0

我可能沒有正確地解釋它。問題是回調函數本身是數組中每個對象的成員函數。我會在問題中添加更多信息。 – apokryfos

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

從我的觀點。查看一個優雅的解決方案是創建一個Container類,其中將有一個地圖方法。喜歡的東西:

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) } 
+1

我喜歡這個。這並不是我所期待的,但它是一種優雅的面向對象的方法。 – apokryfos

相關問題