7

que vi esta algorithm that will take numbers or words and find all possible combinationsPHP tomar todas las combinaciones

Y lo estoy usando, pero no devuelve todas las combinaciones "reales".

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

y devuelve:

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

Pero estas no son todas las combinaciones reales, todas las combinaciones reales incluye también éstos:

cat cat 
dog dog 
fish fish 

y eso es lo Necesito el método para obtener todas las combinaciones reales:

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

¿Por qué no añadir estas combinaciones usted mismo? Parece bastante fácil recorrer tus datos y agregar los pares manualmente. –

+0

¿No es esta la misma pregunta que antes? Simplemente estás teniendo dudas sobre la respuesta que parece. ¿Por qué no continuar allí? – Nanne

+3

Math_Combinatorics - "Un paquete que devuelve todas las combinaciones y permutaciones, sin repetición, de un conjunto dado y tamaño de subconjunto. Las matrices asociativas se conservan". La clave aquí es "sin repetición". – strkol

Respuesta

9

OK, aquí está el código (y por cierto, gracias por publicar un problema tan interesante y desafiante - al menos para mí ... :-)) - utilizando recursividad para todas las permutaciones posibles (por N) Dado un vector de elementos)

Código:

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

?> 

salida:

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 
) 

PISTA: Por permutations($words,2), usted será capaz de obtener exactamente lo que quería ...

+0

Muchas gracias, es solo que necesito, gracias :) – Minion

+0

@MySelf De nada! :-) –

+0

Estoy tratando de convertir esto para devolver una matriz de matrices en lugar de una matriz de cadenas. Entonces, cada matriz interna tendría $ n elementos en ella. Está resultando más difícil de lo que parece debería ser ... –

0

su código actual le da permutaciones, sólo tiene que añadir los duplicados:

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

Cuál es el problema?

+0

El problema es que no es genérico, y no funcionará si está trabajando con más de 2 dimensiones: en 3 dimensiones, necesitaría agregar cat cat fish, cat fish cat, fish cat cat. etc ... otra vez combinatoria. –

Cuestiones relacionadas