2009-12-24 3 views
1

Ce que je fais est de boucler sur un tableau et d'exécuter une fonction sur chaque valeur du tableau (la fonction renvoie true en cas de succès, false en cas d'erreur). Je voudrais retourner faux si l'un des appels à l'intérieur de la boucle a renvoyé faux, mais je veux que la boucle entière soit traitée.Obtention de la valeur de retour globale d'une fonction dans une boucle

probablement plus facile d'expliquer avec le code:

foreach($this->_cacheLocations as $cacheId) 
{ 
    $this->deleteCache($cacheId); 
} 

return true/false depending on whether anything failed above; 

Je préfère ne pas introduire une variable de garder une trace de tout faux si possible. Par exemple, je préférerais ne pas faire ce qui suit:

$result = true; 
foreach($this->_cacheLocations as $cacheId) 
{ 
    $_result = $this->deleteCache($cacheId); 
    if(!$_result) $result = false; 
} 

return $result; 

Y at-il une façon élégante de le faire ou dois-je faire juste la deuxième façon?

+0

Il n'y a pas moyen plus simple de le faire, sauf comme seule variable de Pascal. – wallyk

Répondre

2

Afin de suivre plusieurs résultats de retour ensemble, vous aurez malheureusement besoin d'une variable. Si vous ne voulez pas que ce soit une variable locale dans la portée de votre boucle, vous pouvez créer une propriété d'objet définie par deleteCache(), mais à moins qu'elle ne soit utilisée par d'autres fonctions, une variable locale est la solution la plus propre.

En supposant que $this->deleteCache() retourne toujours true ou false, vous pouvez le raccourcir à quelque chose comme ceci:

$result = true; 
foreach($this->_cacheLocations as $cacheId) 
{ 
     $result = $this->deleteCache($cacheId) && $result; 
} 
return $result; 
+0

Merci, c'est certainement plus propre que ce que j'avais. –

+1

Notez que dans la plupart des langages, l'opérateur '&& court-circuite, donc après la première valeur' false', la boucle n'appelle plus la fonction. – Javier

+0

Excellent point Javier, vous avez raison. J'ai inversé l'ordre des opérations pour le réparer. Merci. – zombat

3

J'irais avec une variable, comme vous l'avez fait dans votre deuxième partie de code - au moins, c'est ce que je fais dans ce genre de situations.


Si vous voulez éliminer une variable temporaire, vous pouvez utiliser:

$result = true; 
foreach($this->_cacheLocations as $cacheId) 
{ 
     if (!$this->deleteCache($cacheId)) { 
      $result = false; 
     } 
} 
return $result; 

Mais l'idée reste la même chose que ce que vous avez publié.

+0

convenu, pas de hacks autour de celui-ci. –

+0

Une bonne réponse. Je vous remercie. –

+0

De rien :-) Amusez-vous! –

Questions connexes