phparraysmultidimensional-arraymergetranspose

Merge and transpose multiple flat associative arrays into a 2d array with null values where column values are missing


I need to get two arrays to merge into one while keeping all the keys in place and listing the values in an array like in this example:

$array1 = [
    'car' => '3',
    'bus' => '2'
];
$array2 = [
    'dog' => '1',
    'car' => '2',
    'bird' => '9'
];  

Desired result:

$merged = [
    'car' =>  ['3',  '2'], 
    'bus' =>  ['2',  null],
    'dog' =>  [null, '1'],
    'bird' => [null, '9']
];

Solution

  • function merge_common_keys(){
        $arr = func_get_args();
        $num = func_num_args();
    
        $keys = array();
        $i = 0;
        for ($i=0; $i<$num; ++$i){
            $keys = array_merge($keys, array_keys($arr[$i]));
        }
        $keys = array_unique($keys);
    
        $merged = array();
    
        foreach ($keys as $key){
            $merged[$key] = array();
            for($i=0; $i<$num; ++$i){
                $merged[$key][] = isset($arr[$i][$key]) ? $arr[$i][$key] : null;
            }
        }
        return $merged;
    }
    

    Usage:

    $merged = merge_common_keys($array1,$array2);
    

    PS. It can work with more than two arrays, just pass as many as you want as next arguments.