MrUpsidown MrUpsidown - 1 month ago 8
PHP Question

PHP add missing keys between arrays

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


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

)


Thanks in advance for any help on how to achieve that.

Answer

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