2009-11-05 10 views

Répondre

6

Voici le code pour obtenir toutes les permutations:

http://www.php.net/manual/en/function.shuffle.php#90615

Avec le code pour obtenir le jeu de puissance, les permutations sont celles d'une longueur maximale, le jeu de puissance doit être toutes les combinaisons. Je n'ai aucune idée de ce que sont les dispositions, donc si vous pouvez les expliquer, cela aiderait.

+0

bonne recherche VL –

5

Vous pouvez utiliser cette classe: http://pear.php.net/package/Math_Combinatorics

et de l'utiliser comme:

$combinatorics = new Math_Combinatorics; 

$words_arr = array(
    'one' => 'a', 
    'two' => 'b', 
    'three' => 'c', 
    'four' => 'd', 
    ); 

for ($i=count($words_arr)-1;$i>=1;$i--) { 
    echo '<br><br>' . $i . ':<br>'; 
    $combinations_arr = $combinatorics->combinations($words_arr, $i); 
    foreach ($combinations_arr as $combinations_arr_item) { 
     echo implode(', ', $combinations_arr_item) . '<br>'; 
    } 
} 
1
/* Combinations */ 
function nCr($n, $r) 
{ 
    if ($r > $n) 
    { 
    return NaN; 
    } 
    if (($n - $r) < $r) 
    { 
    return nCr($n, ($n - $r)); 
    } 
    $return = 1; 
    for ($i = 0; $i < $r; $i++) 
    { 
    $return *= ($n - $i)/($i +1); 
    } 
    return $return; 
} 

/* Permutations */ 
function nPr($n, $r) 
{ 
    if ($r > $n) 
    { 
    return NaN; 
    } 
    if ($r) 
    { 
    return $n * (nPr($n -1, $r -1)); 
    } 
    else 
    { 
    return 1; 
    } 
} 
0

Je voudrais suggérer ma solution d'un CombinationsGenerator, qui génère des combinaisons d'éléments du tableau .

Il est limité à toutes les combinaisons sont de la pleine longueur, et ne répète pas n'importe quel élément. Mais je crois que la mise en œuvre ne serait pas trop difficile.

class CombinationsGenerator 
{ 
    public function generate(array $list): \Generator 
    { 
     if (count($list) > 2) { 
      for ($i = 0; $i < count($list); $i++) { 
       $listCopy = $list; 

       $entry = array_splice($listCopy, $i, 1); 
       foreach ($this->generate($listCopy) as $combination) { 
        yield array_merge($entry, $combination); 
       } 
      } 
     } elseif (count($list) > 0) { 
      yield $list; 

      if (count($list) > 1) { 
       yield array_reverse($list); 
      } 
     } 
    } 
} 

$generator = new \CombinationsGenerator(); 

foreach ($generator->generate(['A', 'B', 'C', 'D']) as $combination) { 
    var_dump($combination); 
} 

Il est dans le style PHP7, il utilise un \Generator parce que je crois qu'il ya de bonnes raisons de le faire.