php相同键值对数组合并

如下两个数组 ,求一个最佳的合并方法

$arr_1 = [
    ['id'=>1,'cc'=>'dd','ee'=>'hh'],
    ['id'=>2,'cc'=>'gg','ee'=>'qq'],
    ['id'=>3,'cc'=>'yy','ee'=>'!!'],
];
$arr_2 = [
    ['id'=>2,'hh'=>'##','ll'=>'^^'],
    ['id'=>1,'hh'=>'@@','ll'=>'%%'],
    ['id'=>4,'hh'=>'$$','ll'=>'&&'],
];
$arr = [];
foreach ($arr_1 as $key => &$value) {
    foreach ($arr_2 as $k => $item) {
        if ($value['id'] === $item['id']) {
            $temp = array_merge($value,$item);
            $arr[] = $temp;
        }
    }
}

$temp_ids = array_column($arr, 'id');

$sub_1 = array_filter($arr_1,function($o) use ($temp_ids){
    if (!in_array($o['id'], $temp_ids)) {
        return true;
    }
});


$sub_2 = array_filter($arr_2,function($i) use ($temp_ids){
    if (!in_array($i['id'], $temp_ids)) {
        return true;
    }
});

$res = array_merge($arr,$sub_1,$sub_2);
echo json_encode($res);
exit;

结果

[{"id":1,"cc":"dd","ee":"hh","hh":"@@","ll":"%%"},{"id":2,"cc":"gg","ee":"qq","hh":"##","ll":"^^"},{"id":3,"cc":"yy","ee":"\uff01\uff01"},{"id":4,"hh":"$$","ll":"&&"}]
阅读 3.3k
2 个回答

实际上作者那样写也挺不错了
如果想要使用有气势的排比句可以这样

function compare_id($a,$b){
    return $a['id'] - $b['id'];
}

$intersect_a = array_uintersect($arr_1, $arr_2, 'compare_id');
$intersect_b = array_uintersect($arr_2, $arr_1, 'compare_id');
$diff_a = array_udiff($arr_1, $arr_2, 'compare_id');
$diff_b = array_udiff($arr_2, $arr_1, 'compare_id');
usort($intersect_a, 'compare_id');
usort($intersect_b, 'compare_id');

echo json_encode(array_merge(array_map('array_merge', $intersect_a, $intersect_b), $diff_a,$diff_b));

我也秀一下黑科技

        $a1 = array_combine(array_column($arr_1, 'id'), $arr_1);
        $a2 = array_combine(array_column($arr_2, 'id'), $arr_2);
        $result = [];
        foreach ($a1 as $id => $item) {
            if (key_exists($id, $a2)) {
                $result[] = array_merge($item, $a2[$id]);
                unset($a2[$id]);
            } else {
                $result[] = $item;
            }
        }
        $result = array_merge($result, $a2 ?: []);
        array_multisort(array_column($result, 'id'), SORT_ASC, $result); 
        dump($result);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题