Search code examples
phparraysassociative-arraydefault-valuemerging-data

Merge multiple associative arrays and add missing columns with a default value


I have the following code:

$a = array('a' => 'some value', 'b' => 'some value', 'c' => 'some value');
$b = array('a' => 'another value', 'd' => 'another value', 'e' => 'another value', 'f' => 'another value');
$c = array('b' => 'some more value', 'x' => 'some more value', 'y' => 'some more value', 'z' => 'some more value');

$d = array($a, $b, $c);

var_export($d) will output:

array (
  0 => 
  array (
    'a' => 'some value',
    'b' => 'some value',
    'c' => 'some value',
  ),
  1 => 
  array (
    'a' => 'another value',
    'd' => 'another value',
    'e' => 'another value',
    'f' => 'another value',
  ),
  2 => 
  array (
    'b' => 'some more value',
    'x' => 'some more value',
    'y' => 'some more value',
    'z' => 'some more value',
  ),
)

How would I go about combining the array keys and end up with the following output?

Array
(
    [0] => Array
        (
            [a] => some value
            [b] => some value
            [c] => some value
            [d] => 
            [e] => 
            [f] => 
            [x] => 
            [y] => 
            [z] => 
        )

    [1] => Array
        (
            [a] => another value
            [b] => 
            [c] => 
            [d] => another value
            [e] => another value
            [f] => another value
            [x] => 
            [y] => 
            [z] => 
        )

    [2] => Array
        (
            [a] => 
            [b] => some more value
            [c] => 
            [d] => 
            [e] => 
            [f] => 
            [x] => some more value
            [y] => some more value
            [z] => some more value
        )
)

Solution

  • Yes you can use array_merge in this case:

    $a = array('a' => 'some value', 'b' => 'some value', 'c' => 'some value');
    $b = array('a' => 'another value', 'd' => 'another value', 'e' => 'another value', 'f' => 'another value');
    $c = array('b' => 'some more value', 'x' => 'some more value', 'y' => 'some more value', 'z' => 'some more value');
    $d = array($a, $b, $c);
    $keys = array();
    foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($d)) as $key => $val) $keys[$key] = '';
    $data = array();
    foreach($d as $values) {
        $data[] = array_merge($keys, $values);
    }
    
    echo '<pre>';
    print_r($data);
    

    EDIT: Another way would be to create key pair values with keys paired with empty, then, map each $d and merge:

    $keys = array_keys(call_user_func_array('array_merge', $d));
    $key_pair = array_combine($keys, array_fill(0, count($keys), null));
    $values = array_map(function($e) use ($key_pair) {
        return array_merge($key_pair, $e);
    }, $d);