2017-08-06 3 views
-2

Ich habe eine dynamische Array in dieser Struktur:Alle Modi kombinieren zwei Arrays

$arr = [ 
    ['R1', 'R2'], 
    ['A1', 'A2', 'A3'], 
    ['M1', 'M2'] 
]; 

ich will alle Kombinationen für dieses Array finden, dh:

R1A1M1 
R1A1M2 
R1A2M1 
R1A2M2 
R1A3M1 
R1A3M2 
R2A1M1 
R2A1M2 
R2A2M1 
R2A2M2 
R2A3M1 
R2A3M2 

weil Feldlänge nicht statisch ich bin muss eine rekursive Funktion verwenden, um dieses Problem zu lösen. Was ist Code in PHP oder js für dieses Problem?

danke

+5

und was Sie selbst versucht haben? –

+2

Können Sie sich bitte zwischen JavaScript und PHP entscheiden? Oder wollen Sie beide Lösungen? – PeterMader

+0

Ich schrieb diesen Code für ein statisches Array: https://gist.github.com/smart-twists/b18d23be530f26d6f3007bebc2b0ee89 Ich bevorzuge es, die Funktion in Java-Skript zu schreiben. –

Antwort

3
var result = [""]; 
$arr.forEach(function(arr){ 
    var tmp = []; 
    arr.forEach(function(el){ 
    result.forEach(function(curr){ 
    tmp.push(curr+el); 
    }); 
    }); 
result = tmp; 
}); 

Einige Iterationen sollte es tun ...

Result


Ein weiterer, eher statischen Ansatz (wahrscheinlich schneller):

var result = new Array($arr.reduce((l,a)=>l*a.length,1)) 
    .fill(""); 

for(var i = 0; i < result.length; i++){ 
    var l = result.length/$arr[0].length; 
    for(var j = 0; j < $arr.length; j++){ 
    result[i] += $arr[j][Math.floor(i/l)% $arr[j].length ]; 
    if($arr[i+1]) l = l/$arr[i+1].length; 
    } 
+0

das ist sehr, sehr gut. es ist fantastisch. könnten Sie bitte diesen Code in PHP schreiben? –

+0

Nein, ich weiß nicht php:/ –

+0

Vielen Dank. Ich schrieb dies in PHP: https://gist.github.com/smart-twists/931358399be55a617ccb674fdc26471d –

0

Um alle Kombinationen Ihrer Arrays zu erhalten, müssen Sie eine Power Set Funktion

In der Mathematik, die Potenzmenge (oder Powerset) jeden Satz S, geschrieben P (S), ℘ (S), P (S), ℙ (S) oder 2S, ist die Menge aller Teilmengen von S, einschließlich der leeren Menge und S selbst.

Sie könnten dies selbst erstellen, oder finden Sie eine solche Funktion bereits geschrieben. Ich werde https://github.com/Xotic750/power-set-x für ein Beispiel verwenden.

const arr = [ 
 
    ['R1', 'R2'], 
 
    ['A1', 'A2', 'A3'], 
 
    ['M1', 'M2'] 
 
]; 
 

 
const flattened = [...arr[0], ...arr[1], ...arr[2]]; 
 
const combinations = powerSet(flattened); 
 
const stringCombinations = combinations.map(combination => combination.join('')); 
 
console.log(stringCombinations);
<script src="https://rawgit.com/Xotic750/power-set-x/master/lib/power-set-x.min.js"></script> 
 
<script> 
 
    var powerSet = returnExports 
 
</script>

Sie können dann alle erforderlichen Filterung durchführen oder auf die Ergebnisse sortiert werden.

Zum Beispiel, wenn Sie nur die Kombinationen möchten, die Sie in Ihrer Frage und in dieser bestimmten Reihenfolge angegeben haben.

const arr = [ 
 
    ['R1', 'R2'], 
 
    ['A1', 'A2', 'A3'], 
 
    ['M1', 'M2'] 
 
]; 
 

 
const flattened = [...arr[0], ...arr[1], ...arr[2]]; 
 
const combinations = powerSet(flattened); 
 
const stringCombinations = combinations.map(combination => combination.join('')); 
 
const filtered = stringCombinations.filter(string => /^R\dA\dM\d$/.test(string)).sort(); 
 
console.log(filtered);
<script src="https://rawgit.com/Xotic750/power-set-x/master/lib/power-set-x.min.js"></script> 
 
<script> 
 
    var powerSet = returnExports 
 
</script>

Für Power Set Funktionen in vielen Sprachen finden Sie unter: https://rosettacode.org/wiki/Power_set

Zum Beispiel kann in ES6 Power Set einfach als

const arr = [ 
 
    ['R1', 'R2'], 
 
    ['A1', 'A2', 'A3'], 
 
    ['M1', 'M2'] 
 
]; 
 

 
const flattened = [...arr[0], ...arr[1], ...arr[2]]; 
 
const powerSet = xs => xs.reduceRight((a, x) => a.concat(a.map(y => [x].concat(y))), [[]]); 
 
const combinations = powerSet(flattened); 
 
console.log(combinations);

geschrieben werden
0
var mohem = new Array($arr.reduce((l,a)=>l*a.length,1)) 
    .fill(""); 

for(var i = 0; i < mohem.length; i++){ 
    var l = mohem.length/$arr[0].length; 
    for(var j = 0; j < $arr.length; j++){ 
    mohem[i] += $arr[j][Math.floor(i/l)% $arr[j].length ]; 
    if($arr[i+1]) l = l/$arr[i+1].length; 
    } 
+0

danke. Ihre Antwort ähnelt der vorherigen Antwort. –

0

Sie eine einzige Zeile Ansatz mit ES6

var array = [['R1', 'R2'], ['A1', 'A2', 'A3'], ['M1', 'M2']], 
 
    result = array.reduce((a, b) => a.reduce((r, v) => r.concat(b.map(w => [].concat(v, w))), [])); 
 

 
console.log(result.map(a => a.join('')));
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

Sie wie folgt möglicherweise tun verwenden könnte;

var arr = [ ['R1', 'R2'], ['A1', 'A2', 'A3'], ['M1', 'M2']]; 
 
    res = arr.reduceRight((a,b) => b.reduce((r,e) => r.concat(a.map(f => e + f)), [])); 
 
console.log(res);