7

ho visto questo algorithm that will take numbers or words and find all possible combinationsPHP prendere tutte le combinazioni

e sto usando, ma non restituisce tutte le combinazioni "reali".

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

e restituisce:

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

Ma queste non sono tutte le combinazioni reali, tutte le combinazioni reali include anche queste:

cat cat 
dog dog 
fish fish 

E questo è ciò che Ho bisogno, il metodo per ottenere tutte le combinazioni reali:

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

Perché non si fa ad aggiungere queste combinazioni da soli? Sembra abbastanza facile scorrere i dati e aggiungere le coppie manualmente. –

+0

Non è la stessa domanda di prima? Hai solo dei dubbi sulla risposta che sembra. perché non continuare lì? – Nanne

+3

Math_Combinatorics - "Un pacchetto che restituisce tutte le combinazioni e le permutazioni, senza la ripetizione, di un dato set e dimensione del sottoinsieme. Gli array associativi vengono mantenuti.". La chiave qui è "senza ripetizione". – strkol

risposta

9

OK, ecco il codice (e btw, grazie per la pubblicazione di un tale problema interessante e stimolante - almeno per me ... :-)) - utilizzando la ricorsione per tutte le possibili permutazioni (da N) data una matrice di elementi)

Codice:

<?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); 

?> 

uscita:

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 
) 

SUGGERIMENTO: By permutations($words,2), sarete in grado di ottenere esattamente quello che voleva ...

+0

Grazie mille, è solo che ho bisogno, grazie :) – Minion

+0

@MySelf Prego! :-) –

+0

Sto provando a convertire questo per restituire una matrice di matrici invece di una serie di stringhe. Quindi ogni array interno avrebbe $ n elementi in esso. Si sta dimostrando più difficile di quanto sembra dovrebbe essere ... –

0

il codice corrente consente di permutazioni, sufficiente aggiungere duplicati:

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

Qual è il problema?

+0

Il problema è che non è generico e non funzionerà se si utilizzano più di 2 dimensioni: in 3 dimensioni dovrebbe aggiungere cat cat fish, cat fish cat, fish cat cat. ecc ... di nuovo combinatorics. –

Problemi correlati