2017-11-10 19 views
3

2つの配列をそれぞれのキーの中でどのように組み合わせるか 私は試しましたが、array_mergeを試してみましたが、うまくいきませんでした。2つの配列をそれぞれのキーに従ってマージする方法は?

配列1:

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" 
    } 
    } 
} 

どのようにすることができ、私もarray_merge_recursiveで試してみました...同じ...

これらは私の二つの配列ですこれを達成するには?

私がグラフ化することを決めた理由を説明するのは非常に良いではないよ:

enter image description here

あなたが何か他のものが必要な場合は私に聞いてください!

+1

最初の配列が1つのより多くの深さを有しています。何故ですか? –

+0

申し訳ありませんが、私は編集しました... –

+0

あなたは本当に配列形式で希望の出力を提供する必要があります。イメージはマージがどのように起こるかを実際には明らかにしていません。 – trincot

答えて

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; 
} 
+0

非常に興味深い解決策ですが、ここで私の答えにサンプルデータと異なる結果が得られました。私はこれを引き起こす問題が何であるか疑問に思います。 –

+0

はい、サンプルデータ用に2つの配列を取得する方法については、解説を書きました。 –

+0

'var_export'提案をありがとう。しかし、私は@ジョン・ウォルグンベ(John B. Walugembe)の答えをここで言及し、結果を比較しようとしています。私はノートのコメントを削除し、代わりに 'var_export'を使ってサンプルのデータを編集し、配列をより明確に表示しました。私が照会している違いは、このリンクから見ることができます:http://algowriter.com/john/test_arr_merge.php –

関連する問題