2012-09-11 21 views
6

mam tablicę o trzech elementów $base =(#m, #f,#p)wszystkich kombinacji x pow rw php

mam drugi układ mającej dowolną liczbę elementów takich jak $var = (s1, s2)

Teraz trzeba utworzyć wszystkie możliwe kombinacje w zależności tylko od macierzy bazowej. Znaleziona przeze mnie formuła to x pow y.

W tym przykładzie my macierz bazowa ma trzy elementy i $var ma tak pow(3, 2) jest . Potrzebuję tych dziewięciu kombinacji. tj.

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

Liczba elementów w drugiej macierzy to w efekcie długość generowanych kombinacji. Ponieważ w tym przykładzie długość tablicy 2 oznacza 2, więc wszystkie wytworzone łańcuchy mają długość 2.

+0

Wszystko czego potrzebujesz to zagnieżdżona pętla i tablica 'n-D'. – hjpotter92

+1

Jak druga tablica odnosi się do pierwszej? Nie widzę, jak to ma znaczenie. – DaveRandom

+0

@DaveRandom Rozważ drugą tablicę z 3 wartościami. Rezultatem będzie tablica 3x3x3. – hjpotter92

Odpowiedz

4

Można użyć funkcji rekurencyjnej takiego:

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

Doskonale, widzę, że działa to doskonale dla mnie. Popracuję nad tym i zaktualizuję go, jeśli znajdzie się jakiś problem. U R SUPERB :) – user1635914

+0

Świetnie, cieszę się, że mogłem pomóc! Powodzenia! – 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); 
?> 

roboczej codepad łącza (na przedstawionym przykładzie).

LINKI

+1

jeśli zmienisz $ poss = Array (1, 2,3), czyli długość stała się trzecią, powinna wygenerować wartość o długości trzeciej, podczas gdy ten kod generuje wartość o długości 2, niezależnie od rozmiaru $ poss – user1635914

+0

powinno być jak to [0] => niektóre niektóre [1] => niektóre coś ..... tak na – user1635914

+0

To nie wydaje się działać, chyba że źle zrozumiałem pytanie. Jeśli użyjesz wejścia OP, otrzymasz 3 identyczne zestawy 3 kombinacji. – Asciiom

Powiązane problemy