【问题标题】:Combine multiple array to another array [duplicate]将多个数组合并到另一个数组[重复]
【发布时间】:2018-02-28 22:57:43
【问题描述】:

我想像这样组合 2 个数组

示例 1:

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

会变成

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

示例 2:

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

会变成

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

任何想法或建议我的算法都可以像这样非常感谢

【问题讨论】:

  • 两个 foreach 循环。您的第二个示例(也称为 Ex1)不够详细,我们无法知道发生了什么。
  • 听起来您正在寻找两个数组的笛卡尔积。也许this answer 能帮上忙?
  • 这是我的回答stackoverflow.com/questions/6311779/… 非常感谢我的朋友@tugayac
  • 不用担心,很高兴它有用:)
  • 为什么是 php 标签?

标签: php algorithm


【解决方案1】:

简化版;按索引合并数组

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

【讨论】:

    【解决方案2】:

    您提出的问题与Leetcode Challenge 非常相似。这个想法是使用Backtracking

    伪伪代码:

    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, list of Array to be multiplied, "")一样调用

    假设您的ArrayList = [['A'], ['C', 'D']]。和CPCartesianProduct

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 2017-03-20
      • 2014-06-29
      • 1970-01-01
      • 2017-03-22
      • 2020-10-08
      • 1970-01-01
      相关资源
      最近更新 更多