Skip to main content
 首页 » 编程设计

php之如何有效地将两个(或更多)关联数组与公共(public)键组合起来

2025年05月04日21over140

更一般地说,假设我们有两个具有一个共同属性的不同长度的列表:

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 folk展示:)。就此而言,我很好奇 Excel/VBA 是否可以处理这个问题。这就是我开始尝试解决这个问题的地方,我认为“excel 肯定可以处理列表!”。

我完全知道这个问题围绕 SO 有很多变体。我已经看过其中的几个,但仍然觉得我应该在这里试用我的版本。

非常感谢您的想法。

谢谢!

回复

请您参考如下方法:

对于 Python 中的通用解决方案,对于任意数量的列表:

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

在线查看它:ideone