我有一个对象数组,我想将它转换为每个对象的方法结果的数组。我可以做得很好,但我想知道是否有一个更清洁/更好的方法呢?例如,假装这是我正在使用的以及我现在是如何做的:
$objects = array();
$objects[] = new Dog();
$objects[] = new Dog();
$objects[] = new Dog();
$data = array();
foreach ($objects as $obj) {
$data[] = $obj->myMethod();
}
显然这不是非常重要,但了解将来从$data
生成$objects
的更好方法会很好。有任何想法吗?我在想这里有一些功能,比如array_map()
或其他东西,但我找不到它。
答案 0 :(得分:1)
你确实可以使用PHP array_map()来执行此操作
function cb($obj) { return $obj->myMethod(); }
.
.
$data = array_map(cb, $objects);
答案 1 :(得分:1)
如果你有php 5.3或更高版本,更简洁的方法是使用带有匿名函数的array_map():
$retArray = array_map(function($o){ $o->myMethod(); }, $myArray);
如果你没有php 5.3,那么你必须事先声明这个函数并将函数名传递给array_map()
答案 2 :(得分:1)
你可以使用更多的OOP:ish方法使用迭代器。
class TrainedDogIterator implements Iterator {
// implement methods on http://php.net/iterator
public function current() {
$dog = current($this->dogs); // $this->dogs would be your objects
$trained_dog = $this->_trainDog($dog);
return $trained_dog;
}
private function _trainDog($dog) {
// do something with dog
return $dog;
}
}
在示例中使用$data
的地方使用它。
$di = new TrainedDogIterator($dogs);
foreach($di as $dog) {
// $dog is trained
}
答案 3 :(得分:0)
TMTOWTDI,array_walk
与array_map
的工作方式类似,但是就地修改了数组。虽然array_map
具有支持多个数组的优势: