Merge array with common value

£可爱£侵袭症+ 提交于 2021-01-28 03:30:23

问题


I have two arrays namely arr and 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}];

Is it possible to get array below shown from above two arrays?

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

If i use array_merge then i get answer as

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

回答1:


The first function that comes to mind is array_merge_recursive(), but even if you assign temporary associative keys to the subarrays, you end up with multiple January values in a new deep subarray.

But do not despair, there is another recursive function that can do this job. array_replace_recursive() will successfully merge these multidimensional arrays so long as temporary associative keys are assigned first.

Here is a one-liner that doesn't use foreach() loops or if statements:

Code: (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'))));

Output:

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

The breakdown:

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
             )
         )
     );



回答2:


You must decode JSON to arrays, manually merge them and again encode it to 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);



回答3:


You should write your own function to do that

$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);


来源:https://stackoverflow.com/questions/45586634/merge-array-with-common-value

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!