【问题标题】:merge two multi dimensional arrays based on combination of elements from one array in PHP基于PHP中一个数组的元素组合合并两个多维数组
【发布时间】:2013-09-26 10:44:00
【问题描述】:

我有两个数组。我想将 $inv_new 添加到 $inv_h 中,其中 StoreNumber = org_number、SupplierNumber = supplier_number 和 InvoiceNumber = invoice_number 我试过array_merge,但我无法确定如何匹配两个数组中的键,以便在“键”匹配的位置添加新元素。

vdump($inv_new);
 array(1) {
   [0] => array(6) {
   'StoreNumber' → str•3 '11 '
   'SupplierNumber' → str•4 '6303'
   'InvoiceNumber' → str•11 'DI613718812'
   'ReasonCode' → str•4 'Dept'
   ["ReasonNote"] → NULL
   ["ResolutionCode"] → NULL
   }
 }
 vdump($inv_h);
 array(30) {
  ....
   [22] => array(5) {
   'org_id' → str•2 '11'
   'org_number' → str•2 '11'
   'supplier_number' → str•4 '6303'
   'supplier_name' → str•27 'BLAH'
   'invoice_number' → str•11 'DI613718812'
   }

会导致:

      array(30) {
  ....
   [22] => array(8) {
   'org_id' → str•2 '11'
   'org_number' → str•2 '11'
   'supplier_number' → str•4 '6303'
   'supplier_name' → str•27 'BLAH'
   'invoice_number' → str•11 'DI613718812'
   'ReasonCode' -> str 4 'Dept'
   ["ReasonNote"] -> NULL
   ["ResolutionCode"] -> NULL
   }

【问题讨论】:

标签: php multidimensional-array


【解决方案1】:

只需使用循环匹配相应的元素,然后在元素上使用array_merge() 即可复制字段。

foreach ($inv_new as $inv1) {
    foreach ($inv_h as &$inv2) {
        if ($inv1['StoreNumber'] == $inv2['org_id']
            && $inv1['SupplierNumber'] == $inv2['supplier_number']
            && $inv1['InvoiceNumber'] == $inv2['invoice_number']) {
            $inv2 = array_merge($inv1, $inv2);
            break;
        }
    }
}

【讨论】:

  • 一旦找到第一个匹配项,“break”的目的是结束循环吗? (只有一个匹配项,因为这些字段是关键)。我只是想确保我理解。
  • 是的,这就是目的。我认为比赛将是独一无二的。但我犯了一个错误,应该只是break,而不是break 2,结束内循环,继续外循环。
【解决方案2】:

在这种情况下最好手动分配值,因为键使用不同的命名约定,并且 array_unique 可能会阻止分配多个空值。

//iterate over the main array
foreach ($inv_h as $hkey => $hval) {

  //build our if statement (nice and tidy)
  $store_match = ($hval['org_number'] == $inv_new[0]['StoreNumber']);
  $supplier_match = ($hval['supplier_number'] == $inv_new[0]['SupplierNumber']);
  $invoice_match = ($hval['invoice'] == $inv_new[0]['InvoiceNumber']);

  if ($store_match && $supplier_match && $invoice_match) {
    //assign array values manually
    //cant use array merge because we would end up with some duplicates
    //due to different naming conventions (org_number vs StoreNumber)
    $inv_h[$hkey]['ReasonCode'] = $inv_new[0]['ReasonCode'];
    $inv_h[$hkey]['ReasonNote'] = $inv_new[0]['ReasonNote'];
    $inv_h[$hkey]['ResolutionCode'] = $inv_new[0]['ResolutionCode'];

  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多