2012-10-15 5 views
2

je dois simplifier cette méthode avec une récursion pour se débarrasser de la logique métier en double mais je ne peux pas comprendre comment faire:Simplifier cette méthode avec récursion

public function compute() 
{ 
    $ret = array(); 
    foreach ($this->_items as $item) { 
     $ret[] = array($item); 
    } 
    foreach ($this->_items as $item) { 
     foreach ($this->_items as $item2) { 
      $tmp = array($item, $item2); 
      if (count($tmp) === count(array_unique($tmp))) { 
       $ret[] = $tmp; 
      } 
     } 
    } 
    foreach ($this->_items as $item) { 
     foreach ($this->_items as $item2) { 
      foreach ($this->_items as $item3) { 
       $tmp = array($item, $item2, $item3); 
       if (count($tmp) === count(array_unique($tmp))) { 
        $ret[] = $tmp; 
       } 
      } 
     } 
    } 
    return $ret; 
} 

EDIT:

Cette méthode est censé revenir toutes les combinaisons d'éléments du tableau, donc si vous avez tableau comme:

[a, b, c] 

Il retournera:

[ 
    [a], 
    [b], 
    [c], 
    [a, b], 
    [a, c], 
    [b, a], 
    [b, c], 
    [a, b, c], 
    [a, c, b], 
    [b, a, c], 
    [b, c, a], 
    [c, a, b], 
    [c, b, a] 
] 
+3

Quel est le but de votre code? –

+0

Il serait bon pour vous de 'print_r ($ this-> items)' et aussi 'print_r ($ ret)' pour que je puisse comprendre l'entrée et la sortie attendue .... – Baba

+0

@Ofir Baruch J'ai ajouté l'objectif de ce code à ma question. –

Répondre

2

Pour votre calcul, il n'y a pas besoin de récursion pour rationaliser ce que vous appelez la logique métier ici. Au moins pas au début. C'est déjà suffisant pour déplacer le code en double dans une fonction de son propre et ensuite faire le traitement.

Je suggère également que cette première étape en raison de l'ordre d'exécution que vous avez ici:

public function compute() 
{ 

    $ret = array(); 

    foreach ($this->_items as $item) { 
     $ret[] = array($item); 
    } 

    $each = function(array $tmp) use (&$ret) { 
     if (count($tmp) === count(array_unique($tmp))) { 
      $ret[] = $tmp; 
     } 
    } 

    foreach ($this->_items as $item) { 
     foreach ($this->_items as $item2) { 
      $each(array($item, $item2)); 
     } 
    } 

    foreach ($this->_items as $item) { 
     foreach ($this->_items as $item2) { 
      foreach ($this->_items as $item3) { 
       $each(array($item, $item2, $item3)); 
      } 
     } 
    } 

    return $ret; 
} 
+0

J'ai ajouté l'objectif de ce code à ma question. –

+0

Je pense qu'une réponse sur le site existe pour cela. En ce moment je ne peux pas regarder dedans, peut-être plus tard. Mais si vous cherchez un peu, les chances sont que vous le trouviez. – hakre