Php 如何根据各自的键合并两个数组?
如何在各自的键中组合两个数组 我尝试了数组合并,但它没有按我想要的那样工作。我还尝试了使用数组\u merge\u recursive。。。同样的 这是我的两个阵列: 阵列1:Php 如何根据各自的键合并两个数组?,php,arrays,multidimensional-array,array-merge,Php,Arrays,Multidimensional Array,Array Merge,如何在各自的键中组合两个数组 我尝试了数组合并,但它没有按我想要的那样工作。我还尝试了使用数组\u merge\u recursive。。。同样的 这是我的两个阵列: 阵列1: array(2) { [264]=> array(6) { [0]=> array(5) { ["id"]=> string(2) "64" ["concepto"]=> string(27) "IIBB Contrib
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"
}
}
}
我怎样才能做到这一点
我不太擅长解释为什么我决定用图表:
如果你还需要什么,请告诉我 以下解决方案可能有效:
/*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', ), ), ), )
使用
array\u merge
时,它将以不同于非数字键的方式处理数字键。+
运算符不会对它们进行不同的处理,而是在两个数组具有相同键时从第一个数组中获取值
所以你想要的也不是
您可以使用此函数,其工作方式类似于数组\u合并\u递归
,但不会以不同方式处理数字键:
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;
}
第一个数组还有一个深度。为什么?对不起,我编辑了…你真的应该以数组格式提供所需的输出。这张图片并没有真正揭示您希望合并是如何发生的。这是一个非常有趣的解决方案,但是我在这里的答案中得到了与示例数据不同的结果。我想知道是什么问题导致了这一点。是的,我已经在解决方案中添加了注释,说明了如何获取样本数据的两个数组。感谢
var\u导出
建议。但我一直在这里引用我在@John B.Walugembe的答案,试图比较结果。我删除了注释注释,而是使用var\u export
编辑了那里的样本数据,以更清晰地显示数组。我所质疑的区别可以从这个链接中看出:对不起,我从一开始就误解了你。我们的结果不同的原因是,我的解决方案是递归的,而是将单个子数组附加到结果中。OP不清楚他们想要什么,所以可能是他们想要的输出,或者是其他东西。