鍍金池/ 問答/PHP/ php相同鍵值對(duì)數(shù)組合并

php相同鍵值對(duì)數(shù)組合并

如下兩個(gè)數(shù)組 ,求一個(gè)最佳的合并方法

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

結(jié)果

[{"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":"&&"}]
回答
編輯回答
苦妄

實(shí)際上作者那樣寫也挺不錯(cuò)了
如果想要使用有氣勢(shì)的排比句可以這樣

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));
2017年1月21日 03:12
編輯回答
安若晴

我也秀一下黑科技

        $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);
2018年5月7日 04:02