更笼统地说,我们有两个具有不同长度的列表,并具有一个公共属性:

list1: {
         {"orderID":1234, "FirstName":"shaheeb", "LastName":"roshan"},
         {"orderID":9183, "FirstName":"robert", "LastName":"gibbons"},
         {"orderID":2321, "FirstName":"chester"},
       }
list2: {
         {"orderID":1234, "cell":"555-555-5555", "email":"roshan@fake.com"},
         {"orderID":2321, "email":"chester@fake.com"},
       }


我希望这些组合成:

list3: {
         {"orderID":1234, "FirstName":"shaheeb", "LastName":"roshan", "cell":"555-555-5555", "email":"roshan@fake.com"},
         {"orderID":9183, "FirstName":"robert", "LastName":"gibbons"},
         {"orderID":2321, "FirstName":"chester", "email":"chester@fake.com"},
       }


我主要是一名PHP开发人员,并且提出了以下建议:

function mergeArrays($a1, $a2) {
    $larger = (count($a1) > count($a2)) ? $a1 : $a2;
    $smaller = ($larger == $a1) ? $a2 : $a1;
    $combinedArray = array();
    foreach ($larger AS $key=>$largerSet) {
        $combinedRow = array();
        if (isset ($smaller[$key]) ) {
            $combinedRow = $largerSet + $smaller[$key];
            $combinedArray[$key] = $combinedRow;
        }else {
            $combinedArray[$key] = $largerSet;
        }
    }
    return ($combinedArray);
}


如果经过以下测试:

$array1 = array("12345"=>array("OrderID"=>12345, "Apt"=>"blue"));
$array2 = array(
                "12345"=>array("OrderID"=>12345, "AnotherCol"=>"Goons", "furtherColumns"=>"More Data"),
                "13433"=>array("OrderID"=>32544, "Yellow"=>"Submarine")
            );


mergeArrays($ array1,$ array2)输出以下内容:

array(2) {
  [12345]=>
  array(4) {
    ["OrderID"]=>
    int(12345)
    ["AnotherCol"]=>
    string(5) "Goons"
    ["furtherColumns"]=>
    string(9) "More Data"
    ["Apt"]=>
    string(4) "blue"
  }
  [13433]=>
  array(2) {
    ["OrderID"]=>
    int(32544)
    ["Yellow"]=>
    string(9) "Submarine"
  }
}


但是我只是觉得这不是最优雅的解决方案。例如,我应该能够组合n个数组。不太确定我该怎么做。另外,仅查看那部分代码,我就可以肯定有更有效的方法可以满足这一要求。

作为一个学习点,我很好奇python专家是否会借此机会向我们展示PHP专家们:)。因此,我很好奇Excel / VBA是否可以处理此问题。那就是我开始尝试解决这个问题的想法,即“当然可以处理列表!”。

我完全知道,关于SO的这个问题有很多变体。我看了其中的几个,但仍然觉得我应该在这里尝试我的版本。

非常感谢您的想法。

谢谢!

SR

最佳答案

对于Python中的常规解决方案,可使用任意数量的列表:

orders = defaultdict(dict)
for order_list in order_lists:
    for order in order_list:
        orders[order['orderID']].update(order)


看到它在线运行:ideone

关于php - 如何有效地将两个(或多个)关联数组与公用键组合在一起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5123544/

10-09 08:29
查看更多