2012-09-11 15 views
6

I tiene una matriz que tiene tres elementos $base =(#m, #f,#p)toda combinación de x pow y en php

tengo una segunda matriz que tenga cualquier número de elemento como $var = (s1, s2)

Ahora necesito para crear todas las combinaciones posibles dependiendo solo de la matriz base. La fórmula que encontré es x pow y.

En este ejemplo mi matriz base tiene tres elementos y $var tiene , por lo pow(3, 2) es . Necesito estas nueve combinaciones. es decir,

#m#m #m#f #m#p 
#f#m #f#f #f#p 
#p#m #p#f #p#p 

El número de elementos en la 2 ª serie es en efecto la longitud de las combinaciones generadas. Como en este ejemplo la longitud de la segunda matriz es 2 así todas las cadenas generadas tienen longitud 2.

+0

Todo lo que necesita es un bucle anidado y una 'n-D matriz'. – hjpotter92

+1

¿Cómo se relaciona la segunda matriz con la primera? No veo cómo es relevante. – DaveRandom

+0

@DaveRandom Considere la segunda matriz con 3 valores. El resultado será una matriz 3x3x3. – hjpotter92

Respuesta

4

Se puede utilizar una función recursiva de esta manera:

// input definition 
$baseArray = array("#m", "#f", "#p"); 
$varArray = array("s1", "s2", "s3"); 

// call the recursive function using input 
$result = recursiveCombinations($baseArray, sizeof($varArray)); 

// loop over the resulting combinations 
foreach($result as $r){ 
    echo "<br />combination " . implode(",", $r); 
} 

// this function recursively generates combinations of #$level elements 
// using the elements of the $base array 
function recursiveCombinations($base, $level){ 
    $combinations = array(); 
    $recursiveResults = array(); 

    // if level is > 1, get the combinations of a level less recursively 
    // for level 1 the combinations are just the values of the $base array 
    if($level > 1){ 
     $recursiveResults = recursiveCombinations($base, --$level); 
    }else{ 
     return $base; 
    } 
    // generate the combinations 
    foreach($base as $baseValue){ 
     foreach($recursiveResults as $recursiveResult){ 
      $combination = array($baseValue); 
      $combination = array_merge($combination, (array)$recursiveResult); 
      array_push($combinations, $combination); 
     } 
    } 
    return $combinations; 
} 

Working codepad demo

+0

Perfecto, puedo ver que esto funciona bien para mí. Trabajaré en esto y lo actualizaré si encuentro algún problema. U R SUPERB :) – user1635914

+0

¡Excelente, me alegro de poder ayudar! ¡Buena suerte! – Asciiom

0
<?php 
    $strs = Array("some", "thing", "here"); 
    $poss = Array(1, 2); 
    $new = Array(); 
    for($i = 0; $i < pow(count($strs), count($poss)); $i++) { 
     for($j = 0; $j < count($strs); $j++) { 
      $new[$i] = $strs[($i%count($strs))] . " " . $strs[$j]; 
     } 
    } 
    print_r($new); 
?> 

de Trabajo codepad enlace (por ejemplo dado).

LINKS

+1

si cambia $ poss = Matriz (1, 2,3), que es la longitud se convirtió en tres, debe generar valor de longitud tres mientras que este código genera un valor de longitud dos, independientemente del tamaño de $ poss – user1635914

+0

debe ser como esto [0] => algunos algunos algunos [1] => algunos algo ..... así sucesivamente – user1635914

+0

Esto no parece funcionar, a menos que haya entendido mal la pregunta. Si usa la entrada del OP, obtiene 3 conjuntos idénticos de 3 combinaciones. – Asciiom

Cuestiones relacionadas