7

Widziałem to algorithm that will take numbers or words and find all possible combinationsPHP podjąć wszelkie kombinacje

i używam go, ale on nie zwraca wszystkich „prawdziwych” kombinacji.

PHP:

<?php 
    require_once 'Math/Combinatorics.php'; 
    $words = array('cat', 'dog', 'fish'); 
    $combinatorics = new Math_Combinatorics; 
    foreach($combinatorics->permutations($words, 2) as $p) { 
     echo join(' ', $p), "\n"; 
    } 
?> 

I powraca:

cat dog 
dog cat 
cat fish 
fish cat 
dog fish 
fish dog 

Ale to nie są wszystkie prawdziwe kombinacje, wszystkie prawdziwe kombinacje obejmuje te też:

cat cat 
dog dog 
fish fish 

i to, co Potrzebuję, aby uzyskać wszystkie prawdziwe kombinacje:

cat dog 
dog cat 
cat fish 
fish cat 
dog fish 
fish dog 
cat cat 
dog dog 
fish fish 
+0

Dlaczego nie można dodać siebie te kombinacje? Wydaje się dość łatwe, aby przechwytywać dane i dodawać pary ręcznie. –

+0

Czy to nie jest to samo pytanie, co wcześniej? Po prostu masz wątpliwości co do tej odpowiedzi. dlaczego nie kontynuować? – Nanne

+3

Math_Combinatorics - "Pakiet, który zwraca wszystkie kombinacje i permutacje, bez repitycji, danego zestawu i rozmiaru podzbioru. Tablice asocjacyjne są zachowywane.". Kluczem tutaj jest "bez powtórzeń". – strkol

Odpowiedz

9

OK, oto twój kod (i przy okazji, dzięki za opublikowanie tak interesującego i wymagającego problemu - przynajmniej dla mnie ... :-)) - używając rekursji dla wszystkich możliwych permutacji (przez N) biorąc pod uwagę tablicę elementów)

Kod:

<?php 

function permutations($arr,$n) 
{ 
    $res = array(); 

    foreach ($arr as $w) 
    { 
      if ($n==1) $res[] = $w; 
      else 
      { 
       $perms = permutations($arr,$n-1); 

       foreach ($perms as $p) 
       { 
         $res[] = $w." ".$p; 
       } 
      } 
    } 

    return $res; 
} 

// Your array 
$words = array('cat','dog','fish'); 

// Get permutation by groups of 3 elements 
$pe = permutations($words,3); 

// Print it out 
print_r($pe); 

?> 

wyjściowa:

Array 
(
    [0] => cat cat cat 
    [1] => cat cat dog 
    [2] => cat cat fish 
    [3] => cat dog cat 
    [4] => cat dog dog 
    [5] => cat dog fish 
    [6] => cat fish cat 
    [7] => cat fish dog 
    [8] => cat fish fish 
    [9] => dog cat cat 
    [10] => dog cat dog 
    [11] => dog cat fish 
    [12] => dog dog cat 
    [13] => dog dog dog 
    [14] => dog dog fish 
    [15] => dog fish cat 
    [16] => dog fish dog 
    [17] => dog fish fish 
    [18] => fish cat cat 
    [19] => fish cat dog 
    [20] => fish cat fish 
    [21] => fish dog cat 
    [22] => fish dog dog 
    [23] => fish dog fish 
    [24] => fish fish cat 
    [25] => fish fish dog 
    [26] => fish fish fish 
) 

UWAGA: Przez permutations($words,2), będziesz w stanie uzyskać dokładnie to, czego chciał ...

+0

Bardzo dziękuję, właśnie tego potrzebuję, dzięki :) – Minion

+0

@MySelf Nie ma za co! :-) –

+0

Próbuję przekonwertować to, aby zwrócić tablicę tablic zamiast tablicy łańcuchów. Każda wewnętrzna tablica będzie zawierała $ n elementów. To okazuje się trudniejsze, niż wydaje się, że powinno być ... –

0

Twój aktualny kod daje permutacje, wystarczy dodać duplikaty:

foreach($words as $w) { 
    echo "$w $w\n";  
} 

czym problem?

+0

Problem polega na tym, że nie jest generyczny i nie będzie działał, jeśli pracujesz z więcej niż 2 wymiarami: w 3 wymiarach będzie musiał dodać kota kota, kota kota, kota kota. etc ... znowu kombinatoryka. –

Powiązane problemy