Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.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
Php 将多个阵列合并到另一个阵列_Php_Algorithm - Fatal编程技术网

Php 将多个阵列合并到另一个阵列

Php 将多个阵列合并到另一个阵列,php,algorithm,Php,Algorithm,我想要这样的组合2数组 例1: Arr1 = ['A','B','C'], Arr2 = ['D','E'] 将成为 Arr3 = [ ['A','D'],['A','E'],['B','D'],['B','E'],['',''] .... ] Arr4 = [ ['A','D','G'],['A','E','G'],['','',''].... ] 例2: Arr1 = ['A','B','C'], Arr2 = ['D','E'] Arr3 = ['G','H'] 将成为

我想要这样的组合2数组

例1:

Arr1 = ['A','B','C'],
Arr2 = ['D','E']
将成为

Arr3 = [
  ['A','D'],['A','E'],['B','D'],['B','E'],['',''] ....
]
Arr4 = [
  ['A','D','G'],['A','E','G'],['','',''].... 
]
例2:

Arr1 = ['A','B','C'],
Arr2 = ['D','E']
Arr3 = ['G','H']
将成为

Arr3 = [
  ['A','D'],['A','E'],['B','D'],['B','E'],['',''] ....
]
Arr4 = [
  ['A','D','G'],['A','E','G'],['','',''].... 
]

任何想法或建议我的算法都可以像这样,非常感谢简化版;按索引合并数组

$arr1 = range('a', 'b');
$arr2 = range('c', 'f');
$arr3 = range('g', 'k');
$arr4 = range('x', 'z');
$res  = array();

// $counter = 1;
// while ($counter <= 4) {
//   $array = "arr{$counter}";
//   funcIndexMerge($res, $$array);
//   $counter++;
// }

funcIndexMerge($res, $arr1);
funcIndexMerge($res, $arr2);
funcIndexMerge($res, $arr3);
funcIndexMerge($res, $arr4);
var_export($res);

function funcIndexMerge(&$res, $array) {
    foreach ($array as $ari => $val)  {
        if (!isset($res[$ari])) {
            $res[$ari] = array();
        }
        $res[$ari] = array_merge($res[$ari], array($val));
    }
 }
$arr1=范围('a','b');
$arr2=范围('c','f');
$arr3=范围('g','k');
$arr4=范围('x','z');
$res=array();
//$counter=1;
//while($counter$val){
如果(!isset($res[$ari])){
$res[$ari]=array();
}
$res[$ari]=数组合并($res[$ari],数组($val));
}
}

简化版;按索引合并数组

$arr1 = range('a', 'b');
$arr2 = range('c', 'f');
$arr3 = range('g', 'k');
$arr4 = range('x', 'z');
$res  = array();

// $counter = 1;
// while ($counter <= 4) {
//   $array = "arr{$counter}";
//   funcIndexMerge($res, $$array);
//   $counter++;
// }

funcIndexMerge($res, $arr1);
funcIndexMerge($res, $arr2);
funcIndexMerge($res, $arr3);
funcIndexMerge($res, $arr4);
var_export($res);

function funcIndexMerge(&$res, $array) {
    foreach ($array as $ari => $val)  {
        if (!isset($res[$ari])) {
            $res[$ari] = array();
        }
        $res[$ari] = array_merge($res[$ari], array($val));
    }
 }
$arr1=范围('a','b');
$arr2=范围('c','f');
$arr3=范围('g','k');
$arr4=范围('x','z');
$res=array();
//$counter=1;
//while($counter$val){
如果(!isset($res[$ari])){
$res[$ari]=array();
}
$res[$ari]=数组合并($res[$ari],数组($val));
}
}

您建议的问题与此非常相似。想法是使用

Psuedo PsedoCode:

result := string Array
CartesianProduct(rowIndex, ArrayList, stringSoFar):

if rowIndex equal ArrayList.size:
    Add stringSoFar to result
    return
for(eachItem in ArrayList[rowIndex])
    CartesianProduct(rowIndex +1 , ArrayList, stringSoFar + eachItem)
    return 
这是一个执行所有计算的工作马,可以像
CartesianProduct(0,要相乘的数组列表“”)一样调用它

假设您的
ArrayList=[['A'],['C',D']]
。和
CP
be
CartesianProduct

                 CP(0, AL, "")
            (Take 'A')/
                     /
               CP(1, AL, "A") (stringSoFar becomes 'A')
         (Take C) /       \(Take 'D'.Second Iteration with second array['C', 'D']) 
                 /         \
         CP(2, AL, "AC")  CP(2, AL, "AD")
              /              \
  rowIndex equal size.   rowIndex equals listSize i.e No more list to look
  Add "AC" and return    Add stringsoFar ("AD") to result and rerturn 
我对Leetcode问题的解决方案(但使用C++)。希望它能给你一些用PHP编写的想法

class Solution {
public:
    map<char, vector<string>> values {
    {'2', vector<string>{"a", "b", "c"}},
    {'3', vector<string>{"d", "e", "f"}},
    {'4', vector<string>{"g", "h", "i"}},
    {'5', vector<string>{"j", "k", "l"}},
    {'6', vector<string>{"m", "n", "o"}},
    {'7', vector<string>{"p", "q", "r", "s"}},
    {'8', vector<string>{"t", "u", "v"}},
    {'9', vector<string>{"w", "x", "y", "z"}}
    };
vector<string> answer;
void doComb(int index, string digits, string sofar)
{
    if(index == digits.size())
    {
        if(sofar != "")
        {
            answer.push_back(sofar);    
        }
        return;
    }
    for(auto lett : values[digits[index]])
    {
        doComb(index + 1, digits, sofar + lett);
    }
    return;
}
vector<string> letterCombinations(string digits) {
    doComb(0, digits, "");
    return answer;
    }
};
类解决方案{
公众:
映射值{
{'2',向量{“a”,“b”,“c”},
{'3',向量{“d”,“e”,“f”},
{'4',向量{“g”,“h”,“i”},
{'5',向量{“j”,“k”,“l”},
{'6',向量{“m”,“n”,“o”},
{'7',向量{“p”,“q”,“r”,“s”},
{'8',向量{“t”,“u”,“v”},
{'9',向量{“w”,“x”,“y”,“z”}
};
向量答案;
void doComb(整数索引、字符串数字、字符串sofar)
{
如果(索引==位数.size())
{
如果(sofar!=“”)
{
回答:向后推(索法尔);
}
返回;
}
用于(自动:值[位数[索引])
{
文档(索引+1,数字,sofar+lett);
}
返回;
}
矢量字母组合(字符串数字){
doComb(0,数字,“”);
返回答案;
}
};

您建议的问题与此非常相似。想法是使用

Psuedo PsedoCode:

result := string Array
CartesianProduct(rowIndex, ArrayList, stringSoFar):

if rowIndex equal ArrayList.size:
    Add stringSoFar to result
    return
for(eachItem in ArrayList[rowIndex])
    CartesianProduct(rowIndex +1 , ArrayList, stringSoFar + eachItem)
    return 
这是一个执行所有计算的工作马,可以像
CartesianProduct(0,要相乘的数组列表“”)一样调用它

假设您的
ArrayList=[['A'],['C',D']]
。和
CP
be
CartesianProduct

                 CP(0, AL, "")
            (Take 'A')/
                     /
               CP(1, AL, "A") (stringSoFar becomes 'A')
         (Take C) /       \(Take 'D'.Second Iteration with second array['C', 'D']) 
                 /         \
         CP(2, AL, "AC")  CP(2, AL, "AD")
              /              \
  rowIndex equal size.   rowIndex equals listSize i.e No more list to look
  Add "AC" and return    Add stringsoFar ("AD") to result and rerturn 
我对Leetcode问题的解决方案(但使用C++)。希望它能给你一些用PHP编写的想法

class Solution {
public:
    map<char, vector<string>> values {
    {'2', vector<string>{"a", "b", "c"}},
    {'3', vector<string>{"d", "e", "f"}},
    {'4', vector<string>{"g", "h", "i"}},
    {'5', vector<string>{"j", "k", "l"}},
    {'6', vector<string>{"m", "n", "o"}},
    {'7', vector<string>{"p", "q", "r", "s"}},
    {'8', vector<string>{"t", "u", "v"}},
    {'9', vector<string>{"w", "x", "y", "z"}}
    };
vector<string> answer;
void doComb(int index, string digits, string sofar)
{
    if(index == digits.size())
    {
        if(sofar != "")
        {
            answer.push_back(sofar);    
        }
        return;
    }
    for(auto lett : values[digits[index]])
    {
        doComb(index + 1, digits, sofar + lett);
    }
    return;
}
vector<string> letterCombinations(string digits) {
    doComb(0, digits, "");
    return answer;
    }
};
类解决方案{
公众:
映射值{
{'2',向量{“a”,“b”,“c”},
{'3',向量{“d”,“e”,“f”},
{'4',向量{“g”,“h”,“i”},
{'5',向量{“j”,“k”,“l”},
{'6',向量{“m”,“n”,“o”},
{'7',向量{“p”,“q”,“r”,“s”},
{'8',向量{“t”,“u”,“v”},
{'9',向量{“w”,“x”,“y”,“z”}
};
向量答案;
void doComb(整数索引、字符串数字、字符串sofar)
{
如果(索引==位数.size())
{
如果(sofar!=“”)
{
回答:向后推(索法尔);
}
返回;
}
用于(自动:值[位数[索引])
{
文档(索引+1,数字,sofar+lett);
}
返回;
}
矢量字母组合(字符串数字){
doComb(0,数字,“”);
返回答案;
}
};

两个foreach循环。您的第二个示例(也称为Ex1)不够详细,我们无法知道发生了什么。听起来您在寻找两个数组的笛卡尔乘积。也许能帮上忙?这是我的答案,非常感谢我的朋友@tugayacNo的担忧,很高兴它很有用:)为什么是php标签?两个foreach循环。您的第二个示例(也称为Ex1)不够详细,我们无法知道发生了什么。听起来您在寻找两个数组的笛卡尔乘积。也许能帮上忙?这是我的答案,非常感谢我的朋友@tugayacNo的担忧,很高兴它很有用:)为什么使用php标签?