Получить массив с результатами метода объекта для каждого элемента в массиве объектов в PHP - PullRequest
0 голосов
/ 03 декабря 2009

У меня есть массив объектов, и я хочу преобразовать его в массив результата метода каждого из них. Я могу сделать это очень хорошо, но мне интересно, есть ли более чистый / лучший подход к этому, может быть? Например, представьте, что это то, с чем я работаю и как я это делаю сейчас:

$objects = array();

$objects[] = new Dog();
$objects[] = new Dog();
$objects[] = new Dog();

$data = array();
foreach ($objects as $obj) {
  $data[] = $obj->myMethod();
}

Очевидно, что это не супер важно, но было бы неплохо узнать о лучших способах производства $data из $objects в будущем. Есть идеи? Я думал, что для этого есть какая-то функция, например array_map() или что-то еще, но я не нахожу ее.

Ответы [ 4 ]

1 голос
/ 03 декабря 2009

Вы можете использовать немного больше ООП: подход с использованием итераторов.

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
}
1 голос
/ 03 декабря 2009

Если у вас php 5.3 или выше, лучше использовать array_map () с анонимными функциями:

$retArray = array_map(function($o){ $o->myMethod(); }, $myArray);

Если у вас нет php 5.3, у вас остается необходимость объявить функцию заранее и передать имя функции в array_map ()

1 голос
/ 03 декабря 2009

вы действительно можете использовать PHP array_map () , чтобы сделать это

function cb($obj) { return $obj->myMethod(); }
.
.
$data = array_map(cb, $objects);
0 голосов
/ 03 декабря 2009

TMTOWTDI, array_walk работает аналогично array_map, но изменяет массив на месте. Хотя array_map имеет преимущество поддержки нескольких массивов:

http://us3.php.net/array_walk

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...