如何按照各自的键将两个数组合并?

3
如何合并两个数组的各自键名下的值 我尝试了array_merge,但它的效果不是我想要的。我还试过使用array_merge_recursive……但结果一样... 这是我的两个数组:
第一个数组:
   array(2) {
  [264]=>
  array(6) {
    [0]=>
    array(5) {
      ["id"]=>
      string(2) "64"
      ["concepto"]=>
      string(27) "IIBB Contribuyentes Locales"
      ["impuesto"]=>
      string(10) "Anticipo10"
      ["agencia"]=>
      string(4) "ARBA"
      ["vencimiento_del_mes"]=>
      string(10) "2017-11-21"
    }
    [1]=>
    array(5) {
      ["id"]=>
      string(2) "74"
      ["concepto"]=>
      string(26) "IIBB convenio multilateral"
      ["impuesto"]=>
      string(10) "Anticipo10"
      ["agencia"]=>
      string(4) "ARBA"
      ["vencimiento_del_mes"]=>
      string(10) "2017-11-13"
    }
    [2]=>
    array(5) {
      ["id"]=>
      string(1) "1"
      ["concepto"]=>
      string(11) "recaudacion"
      ["impuesto"]=>
      string(4) "IIBB"
      ["agencia"]=>
      string(4) "AGIP"
      ["vencimiento_del_mes"]=>
      string(10) "2017-11-07"
    }
  }
  [265]=>
  array(14) {
    [0]=>
    array(5) {
      ["id"]=>
      string(2) "65"
      ["concepto"]=>
      string(27) "IIBB Contribuyentes Locales"
      ["impuesto"]=>
      string(10) "Anticipo10"
      ["agencia"]=>
      string(4) "ARBA"
      ["vencimiento_del_mes"]=>
      string(10) "2017-11-22"
    }
    [1]=>
    array(5) {
      ["id"]=>
      string(3) "101"
      ["concepto"]=>
      string(41) "Regimen General de Percepcion (Percibido)"
      ["impuesto"]=>
      string(24) "Segunda Quincena Octubre"
      ["agencia"]=>
      string(4) "ARBA"
      ["vencimiento_del_mes"]=>
      string(10) "2017-11-13"
    }
    [2]=>
    array(5) {
      ["id"]=>
      string(3) "101"
      ["concepto"]=>
      string(41) "Regimen General de Percepcion (Percibido)"
      ["impuesto"]=>
      string(26) "Primera Quincena Noviembre"
      ["agencia"]=>
      string(4) "ARBA"
      ["vencimiento_del_mes"]=>
      string(10) "2017-11-24"
    }
  }
}

数组 2:

  array(2) {
  [264]=>
  array(9) {
    [0]=>
    array(6) {
      ["idImpuesto"]=>
      int(10)
      ["idConcepto"]=>
      int(19)
      ["periodo"]=>
      string(4) "2017"
      ["tipoOperacion"]=>
      string(12) "PRESENTACION"
      ["vencimiento"]=>
      string(10) "2017-11-13"
      ["formularios"]=>
      string(3) "713"
    }
    [1]=>
    array(5) {
      ["idImpuesto"]=>
      int(10)
      ["idConcepto"]=>
      int(19)
      ["periodo"]=>
      string(4) "2017"
      ["tipoOperacion"]=>
      string(4) "PAGO"
      ["vencimiento"]=>
      string(10) "2017-11-13"
    }
    [2]=>
    array(6) {
      ["idImpuesto"]=>
      int(30)
      ["idConcepto"]=>
      int(19)
      ["periodo"]=>
      string(7) "2017-10"
      ["tipoOperacion"]=>
      string(12) "PRESENTACION"
      ["vencimiento"]=>
      string(10) "2017-11-21"
      ["formularios"]=>
      string(8) "731,2002"
    }
  }
  [265]=>
  array(3) {
    [0]=>
    array(6) {
      ["idImpuesto"]=>
      int(30)
      ["idConcepto"]=>
      int(19)
      ["periodo"]=>
      string(7) "2017-10"
      ["tipoOperacion"]=>
      string(12) "PRESENTACION"
      ["vencimiento"]=>
      string(10) "2017-11-22"
      ["formularios"]=>
      string(8) "731,2002"
    }
    [1]=>
    array(5) {
      ["idImpuesto"]=>
      int(30)
      ["idConcepto"]=>
      int(19)
      ["periodo"]=>
      string(7) "2017-10"
      ["tipoOperacion"]=>
      string(4) "PAGO"
      ["vencimiento"]=>
      string(10) "2017-11-22"
    }
    [2]=>
    array(5) {
      ["idImpuesto"]=>
      int(308)
      ["idConcepto"]=>
      int(19)
      ["periodo"]=>
      string(7) "2017-10"
      ["tipoOperacion"]=>
      string(4) "PAGO"
      ["vencimiento"]=>
      string(10) "2017-11-06"
    }
  }
}

我该如何实现这个呢?

我不太擅长解释为什么我决定绘制图表:

enter image description here

如果您需要其他内容,请问我!


2
你应该以数组格式提供所需的输出。图片并没有真正展示你想要合并的方式。 - trincot
2个回答

1
以下解决方案可能有效:
/*Let $array1 and $array2 be the two arrays to be combined into one $array3 */  

/* First get the unique values for the keys to be combined: */
$arr = [];
foreach($array1 as $k => $v){ $arr[] = $k; }
foreach($array2 as $k => $v){ $arr[] = $k; }
$arr = array_unique($arr);

/* Scan the two arrays with the unique keys to get the required $array3: */
$array3 = [];
foreach($arr as $v){
if(array_key_exists($v, $array1)){ $array3[$v][] = $array1[$v]; }
if(array_key_exists($v, $array2)){ $array3[$v][] = $array2[$v]; }
}

var_export($array3);   /* the desired result */

示例数据:

$array1 = array ( 264 => array ( 0 => array ( 'id' => '64', 'concepto' => 'IIBB Contribuyentes Locales', 'impuesto' => 'Anticipo10', 'agencia' => 'ARBA', 'vencimiento_del_mes' => '2017-11-21', ), 1 => array ( 'id' => '74', 'concepto' => 'IIBB convenio multilateral', 'impuesto' => 'Anticipo10', 'agencia' => 'ARBA', 'vencimiento_del_mes' => '2017-11-13', ), 2 => array ( 'id' => '1', 'concepto' => 'recaudacion', 'impuesto' => 'IIBB', 'agencia' => 'AGIP', 'vencimiento_del_mes' => '2017-11-07', ), ), 265 => array ( 0 => array ( 'id' => '65', 'concepto' => 'IIBB Contribuyentes Locales', 'impuesto' => 'Anticipo10', 'agencia' => 'ARBA', 'vencimiento_del_mes' => '2017-11-22', ), 1 => array ( 'id' => '101', 'concepto' => 'Regimen General de Percepcion (Percibido)', 'impuesto' => 'Segunda Quincena Octubre', 'agencia' => 'ARBA', 'vencimiento_del_mes' => '2017-11-13', ), 2 => array ( 'id' => '101', 'concepto' => 'Regimen General de Percepcion (Percibido)', 'impuesto' => 'Primera Quincena Noviembre', 'agencia' => 'ARBA', 'vencimiento_del_mes' => '2017-11-24', ), ), ); 

$array2 = array (264 => array ( 0 => array ( 'idImpuesto' => 10, 'idConcepto' => 19, 'periodo' => '2017', 'tipoOperacion' => 'PRESENTACION', 'vencimiento' => '2017-11-13', 'formularios' => '713', ), 1 => array ( 'idImpuesto' => 10, 'idConcepto' => 19, 'periodo' => '2017', 'tipoOperacion' => 'PAGO', 'vencimiento' => '2017-11-13', ), 2 => array ( 'idImpuesto' => 30, 'idConcepto' => 19, 'periodo' => '2017-10', 'tipoOperacion' => 'PRESENTACION', 'vencimiento' => '2017-11-21', 'formularios' => '731,2002', ), ), 265 => array ( 0 => array ( 'idImpuesto' => 30, 'idConcepto' => 19, 'periodo' => '2017-10', 'tipoOperacion' => 'PRESENTACION', 'vencimiento' => '2017-11-22', 'formularios' => '731,2002', ), 1 => array ( 'idImpuesto' => 30, 'idConcepto' => 19, 'periodo' => '2017-10', 'tipoOperacion' => 'PAGO', 'vencimiento' => '2017-11-22', ), 2 => array ( 'idImpuesto' => 308, 'idConcepto' => 19, 'periodo' => '2017-10', 'tipoOperacion' => 'PAGO', 'vencimiento' => '2017-11-06', ), ), );

Result:
$array3 = array ( 264 => array ( 0 => array ( 0 => array ( 'id' => '64', 'concepto' => 'IIBB Contribuyentes Locales', 'impuesto' => 'Anticipo10', 'agencia' => 'ARBA', 'vencimiento_del_mes' => '2017-11-21', ), 1 => array ( 'id' => '74', 'concepto' => 'IIBB convenio multilateral', 'impuesto' => 'Anticipo10', 'agencia' => 'ARBA', 'vencimiento_del_mes' => '2017-11-13', ), 2 => array ( 'id' => '1', 'concepto' => 'recaudacion', 'impuesto' => 'IIBB', 'agencia' => 'AGIP', 'vencimiento_del_mes' => '2017-11-07', ), ), 1 => array ( 0 => array ( 'idImpuesto' => 10, 'idConcepto' => 19, 'periodo' => '2017', 'tipoOperacion' => 'PRESENTACION', 'vencimiento' => '2017-11-13', 'formularios' => '713', ), 1 => array ( 'idImpuesto' => 10, 'idConcepto' => 19, 'periodo' => '2017', 'tipoOperacion' => 'PAGO', 'vencimiento' => '2017-11-13', ), 2 => array ( 'idImpuesto' => 30, 'idConcepto' => 19, 'periodo' => '2017-10', 'tipoOperacion' => 'PRESENTACION', 'vencimiento' => '2017-11-21', 'formularios' => '731,2002', ), ), ), 265 => array ( 0 => array ( 0 => array ( 'id' => '65', 'concepto' => 'IIBB Contribuyentes Locales', 'impuesto' => 'Anticipo10', 'agencia' => 'ARBA', 'vencimiento_del_mes' => '2017-11-22', ), 1 => array ( 'id' => '101', 'concepto' => 'Regimen General de Percepcion (Percibido)', 'impuesto' => 'Segunda Quincena Octubre', 'agencia' => 'ARBA', 'vencimiento_del_mes' => '2017-11-13', ), 2 => array ( 'id' => '101', 'concepto' => 'Regimen General de Percepcion (Percibido)', 'impuesto' => 'Primera Quincena Noviembre', 'agencia' => 'ARBA', 'vencimiento_del_mes' => '2017-11-24', ), ), 1 => array ( 0 => array ( 'idImpuesto' => 30, 'idConcepto' => 19, 'periodo' => '2017-10', 'tipoOperacion' => 'PRESENTACION', 'vencimiento' => '2017-11-22', 'formularios' => '731,2002', ), 1 => array ( 'idImpuesto' => 30, 'idConcepto' => 19, 'periodo' => '2017-10', 'tipoOperacion' => 'PAGO', 'vencimiento' => '2017-11-22', ), 2 => array ( 'idImpuesto' => 308, 'idConcepto' => 19, 'periodo' => '2017-10', 'tipoOperacion' => 'PAGO', 'vencimiento' => '2017-11-06', ), ), ), )

1
使用array_merge的问题在于它会将数字键与非数字键区别对待。当两个数组具有相同的键时,+运算符不会区别对待它们,而是从第一个数组中取值。因此,它们都无法满足您的要求。
您可以使用此函数,它的工作方式类似于array_merge_recursive,但不会将数字键视为不同的键:
function mergeByKeys($a, $b) {
    if (!is_array($a) || !is_array($b)) return $a;
    foreach (array_flip(array_keys($a))+array_flip(array_keys($b)) as $key => $_) {
        $results[$key] = !isset($a[$key]) ? $b[$key]
                       : (!isset($b[$key]) ? $a[$key] 
                          : mergeByKeys($a[$key], $b[$key]));
    }
    return $results;
}

非常有趣的解决方案,但是我在这里的答案中使用示例数据得到了不同的结果。我想知道可能导致这种情况的问题是什么。 - John B. Walugembe
是的,我已经在解决方案中加了注释说明如何获取样本数据的两个数组。 - John B. Walugembe
谢谢您提供使用 var_export 的建议。但是我一直在参考我的答案,尝试比较结果。我已经删除了注释并使用 var_export 编辑了示例数据以更清晰地显示数组。我查询的差异可以从此链接中看到:http://algowriter.com/john/test_arr_merge.php。 - John B. Walugembe
抱歉,我一开始误解了你。我们结果不同的原因是,我的解决方案是递归的,而你则将个别子数组附加到结果中。OP没有明确说明他们想要什么,所以任何一种方法可能都是他们想要的输出,或者仍然是其他东西。 - trincot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接