2012-09-11 6 views
6

Ich habe ein Array mit drei Elementen $base =(#m, #f,#p)alle Kombination von x pow y in PHP

I eine zweite Anordnung eine beliebige Anzahl von Element wie $var = (s1, s2)

Jetzt muss ich alle möglichen Kombinationen erstellen nur vom Basis-Array abhängig. Die Formel, die ich gefunden habe, ist x pow y.

In diesem Beispiel meiner Basis Array hat drei Elemente und $var hat , so pow(3, 2) ist . Ich brauche diese neun Kombinationen. d. h.

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

Die Anzahl der Elemente im zweiten Array entspricht der Länge der generierten Kombinationen. Wie in diesem Beispiel ist die Länge des zweiten Array 2, so dass alle erzeugten Strings Länge 2.

+0

Alles was Sie brauchen, ist eine verschachtelte Schleife und ein 'n-D Array'. – hjpotter92

+1

Wie verhält sich das zweite Array zu dem ersten? Ich sehe nicht, wie es relevant ist. – DaveRandom

+0

@DaveRandom Betrachte ein zweites Array mit 3 Werten. Das Ergebnis wird ein 3x3x3-Array sein. – hjpotter92

Antwort

4

Sie eine rekursive Funktion wie folgt verwendet werden:

// 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

Perfekt, ich kann sehen, das funktioniert gut für mich. Ich werde daran arbeiten und es aktualisieren, wenn irgendein Problem gefunden wird. U R SUPERB :) – user1635914

+0

Ausgezeichnet, froh, ich könnte helfen! Viel Glück! – 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); 
?> 

Arbeits codepad Link (für gegebenes Beispiel) haben.

LINKS

+1

Wenn Sie $ poss = Array (1, 2,3) ändern, wird die Länge drei, es sollte einen Wert der Länge drei erzeugen, während dieser Code einen Wert der Länge zwei erzeugt, unabhängig von der Größe von $ poss – user1635914

+0

sollte es ähnlich sein dies [0] => einige einige [1] => einige etwas ..... so weiter – user1635914

+0

Dies scheint nicht zu funktionieren, es sei denn, ich habe die Frage missverstanden. Wenn Sie die OP-Eingabe verwenden, erhalten Sie 3 identische Sätze von 3 Kombinationen. – Asciiom