Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 所有模式组合两个阵列_Javascript_Php_Arrays_Function_Recursion - Fatal编程技术网

Javascript 所有模式组合两个阵列

Javascript 所有模式组合两个阵列,javascript,php,arrays,function,recursion,Javascript,Php,Arrays,Function,Recursion,我在这个结构中有一个动态数组: $arr = [ ['R1', 'R2'], ['A1', 'A2', 'A3'], ['M1', 'M2'] ]; 我想找到此阵列的所有组合,即: R1A1M1 R1A1M2 R1A2M1 R1A2M2 R1A3M1 R1A3M2 R2A1M1 R2A1M2 R2A2M1 R2A2M2 R2A3M1 R2A3M2 因为数组长度不是静态的,所以我们必须使用递归函数来解决这个问题。 PHP或js中针对这个问题的代码是什么 多谢各位 va

我在这个结构中有一个动态数组:

$arr = [
    ['R1', 'R2'],
    ['A1', 'A2', 'A3'],
    ['M1', 'M2']
];
我想找到此阵列的所有组合,即:

R1A1M1
R1A1M2
R1A2M1
R1A2M2
R1A3M1
R1A3M2
R2A1M1
R2A1M2
R2A2M1
R2A2M2
R2A3M1
R2A3M2
因为数组长度不是静态的,所以我们必须使用递归函数来解决这个问题。 PHP或js中针对这个问题的代码是什么

多谢各位

 var result = [""];
 $arr.forEach(function(arr){
   var tmp = [];
   arr.forEach(function(el){
    result.forEach(function(curr){
     tmp.push(curr+el);
    });
  });
 result = tmp;
});
几次迭代就可以了

另一种更静态的方法可能更快:

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

要获得数组的所有组合,需要一个函数

在数学中,任何一组的幂集或幂集 附言℘S、 PS,ℙS或2S是S的所有子集的集合, 包括空集和S本身

您可以自己创建这个函数,或者找到预先编写的函数。我将用它作为一个例子

常数arr=[ ['R1','R2'], ['A1','A2','A3'], ['M1','M2'] ]; 常数展平=[…arr[0],…arr[1],…arr[2]; 常数组合=功率设置; const stringCombinations=combinations.mapcombination=>combination.join; console.LogStrings组合; var powerSet=returnExports
您可以在ES6中使用单线方法

变量数组=['R1','R2'],['A1','A2','A3'],['M1','M2'], 结果=array.reducea,b=>a.reducer,v=>r.concatb.mapw=>[]。concatv,w,[]; console.logresult.mapa=>a.join; .作为控制台包装{最大高度:100%!重要;顶部:0;}您可以执行以下操作

var arr=['R1','R2'],['A1','A2','A3'],['M1','M2']; res=arr.reduceRighta,b=>b.reducer,e=>r.concata.mapf=>e+f,[];
console.logres;你自己尝试了什么?你能在JavaScript和PHP之间做出选择吗?或者你想要两种解决方案?我为一个静态数组编写了这段代码:我更喜欢用java脚本编写函数。你需要实现一个函数。这非常好。太棒了。你能用PHP写这段代码吗?不,我不懂PHP:/非常感谢。我用PHP写的:谢谢。你的答案和普雷维乌斯的相似。
    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;
  }