2009-12-02 6 views
0

J'ai un tableau d'objets et je veux le convertir en un tableau du résultat d'une méthode de chacun d'eux. Je peux le faire très bien, mais je me demande s'il y a peut-être une approche plus propre/meilleure. Par exemple, faire semblant c'est ce que je travaille avec et comment je le fais maintenant:Obtenir tableau avec les résultats de la méthode objet sur chaque élément dans un tableau d'objets dans PHP

$objects = array(); 

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

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

Il est évident que ce n'est pas super important, mais ce serait bien de connaître de meilleures façons de produire $data à partir de $objects dans le futur. Des idées? Je pensais qu'il y avait une fonction pour cela, comme array_map() ou quelque chose mais je ne le trouve pas.

Répondre

1

vous pouvez en effet utiliser PHP de array_map() pour ce faire

function cb($obj) { return $obj->myMethod(); } 
. 
. 
$data = array_map(cb, $objects); 
+0

En PHP 5.3, vous pouvez utiliser les fonctions anonymes au lieu de 'fonction cb ($ obj)' –

+0

ah oui 5.3 - la version qui ne fonctionne pas correctement en mode CLI pour moi sur Windows 7 :(- mais bien ce serait une meilleure façon de le faire ... –

+0

Cela ressemble à la meilleure façon de s'y prendre - merci Et oui, j'aime aussi la version 5.3 mais je ne l'ai pas en local ou sur le serveur – jeffff

1

Si vous avez php 5.3 ou mieux, la façon plus propre est d'utiliser array_map() avec des fonctions anonymes:

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

Si vous ne pas avoir PHP 5.3, il vous reste à devoir déclarer la fonction auparavant et passer le nom de la fonction à array_map()

0

TMTOWTDI, array_walk fonctionne de manière similaire à array_map, mais modifie le tableau in-place. Bien que array_map a l'avantage de supporter plusieurs tableaux:

http://us3.php.net/array_walk

1

Vous pouvez utiliser un peu plus POO: approche ish à l'aide itérateurs.

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; 
    } 
} 

Utilisez où vous utiliseriez $data dans votre exemple.

$di = new TrainedDogIterator($dogs); 
foreach($di as $dog) { 
    // $dog is trained 
} 
+0

Il s'agit d'une approche bonne/différente du problème, donc merci - cela pourrait aussi être utile pour d'autres choses, dans ce cas j'utilise une fonction réutilisée qui renvoie le tableau d'objets, qui dans d'autres cas doit Bien que la mise en œuvre de cette approche puisse placer la fonctionnalité à un endroit plus approprié dans le code, – jeffff

+0

@pssdbt: the co Si vous donnez une plus grande image de votre système, vous obtiendrez plus de commentaires sur la conception globale, mais je suis d'accord que vous avez marqué la bonne réponse dans ce cas. – chelmertz

Questions connexes