2017-08-09 81 views
2

我有两个数组,即arr和arr2。具有公共值的合并阵列

var arr=[{"month":"January","url":1},{"month":"February","url":102},{"month":"March","url":192}]; 

var arr2=[{"month":"January","ip":12},{"month":"June","ip":10}]; 

是否有可能从上面的数组中获得数组?

result=[{"month":"January","url":1,"ip":12},{"month":"February","url":102},{"month":"March","url":192},{"month":"June","ip":10}]; 

如果我使用array_merge然后我得到的答案

result=[{"month":"January","url":1},{"month":"February","url":102},{"month":"March","url":192},{"month":"January","ip":12},{"month":"June","ip":10}]; 
+1

发生这种情况是因为如果键是数字,'array_merge'不会合并,而是追加新的数据。从PHP手册:*如果输入数组具有相同的字符串键,则该键的后面的值将覆盖前一个。但是,如果数组中包含数字键,则后面的值不会覆盖原始值,但会被追加。* – tilz0R

+0

ok先生。有没有可能获得预期的答案? – Raj

+0

在使用array_merge或更好的array_merge_recursive合并在一起之前,请确保您的数组包含非数字键。例如,您可以将月份名称设置为月份数据的关键字。 – tilz0R

回答

1

想到的第一个函数是array_merge_recursive(),但即使将临时关联密钥分配给子阵列,也会在多个深度子阵列中产生多个January值。

但是不要绝望,还有另一个可以完成这项工作的递归函数。只要首先分配临时关联密钥,array_replace_recursive()将成功合并这些多维数组。

这里是一个单行不使用foreach()循环或if语句:

代码:(Demo

$arr=json_decode('[{"month":"January","url":1},{"month":"February","url":102},{"month":"March","url":192}]',true); 
$arr2=json_decode('[{"month":"January","ip":12},{"month":"June","ip":10}]',true); 
echo json_encode(array_values(array_replace_recursive(array_column($arr,NULL,'month'),array_column($arr2,NULL,'month')))); 

输出:

[{"month":"January","url":1,"ip":12},{"month":"February","url":102},{"month":"March","url":192},{"month":"June","ip":10}] 

细目:

echo json_encode( // convert back to json 
     array_values( // remove the temp keys (reindex) 
      array_replace_recursive( // effectively merge/replace elements associatively 
       array_column($arr,NULL,'month'), // use month as temp keys for each subarray 
       array_column($arr2,NULL,'month') // use month as temp keys for each subarray 
      ) 
     ) 
    ); 
+0

是的......你的解决方案在这种情况下更好:) – Neodan

0

你应该写自己的函数来做到这一点

$res = []; 
foreach ($arr as $item) { 
    $res[$item['month']] = $item; 
} 

foreach ($arr2 as $item) { 
    $res[$item['month']] = isset($res[$item['month']]) ? array_merge($res[$item['month']], $item) : $item; 
} 

var_dump($res); 
2

您必须解码JSON到数组,手动合并它们,再次编码为JSON :)

<?php 
$arr = json_decode('[{"month":"January","url":1},{"month":"February","url":102},{"month":"March","url":192}]', true); 
$arr2 = json_decode('[{"month":"January","ip":12},{"month":"June","ip":10}]', true); 

$result = []; 
foreach ($arr as &$item) { 
    if (empty($arr2)) 
     break; 

    foreach ($arr2 as $key => $item2) { 
     if ($item['month'] === $item2['month']) { 
      $item = array_merge($item, $item2); 
      unset($arr2[$key]); 
      continue; 
     } 
    } 
} 
if (!empty($arr2)) 
    $arr = array_merge($arr, $arr2); 

echo json_encode($arr);