这可能是一个愚蠢的问题,它的方便而不是功能。
假设我们有班级:
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 :(得分: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