PHP
Recursively Merge Multiple PHP Arrays
Learn to merge PHP arrays recursively, handling nested structures with `array_merge_recursive()`. Ideal for combining configuration settings or complex data objects while preserving depth.
<?php
$config1 = [
'database' => [
'host' => 'localhost',
'port' => 3306
],
'settings' => [
'debug' => true
]
];
$config2 = [
'database' => [
'user' => 'admin',
'pass' => 'secret'
],
'settings' => [
'debug' => false,
'logging' => true
]
];
$mergedConfig = array_merge_recursive($config1, $config2);
print_r($mergedConfig);
/* Expected Output:
Array
(
[database] => Array
(
[host] => localhost
[port] => 3306
[user] => admin
[pass] => secret
)
[settings] => Array
(
[debug] => Array
(
[0] => 1
[1] =>
)
[logging] => 1
)
)
Note: For non-array values with same key, array_merge_recursive creates an array of values.
Consider custom recursive merge for overwriting behavior.
*/
// Custom recursive merge for overwriting scalar values
function array_merge_recursive_overwrite(array &$array1, array &$array2) {
$merged = $array1;
foreach ($array2 as $key => &$value) {
if (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) {
$merged[$key] = array_merge_recursive_overwrite($merged[$key], $value);
} else {
$merged[$key] = $value;
}
}
return $merged;
}
$mergedConfigOverwrite = array_merge_recursive_overwrite($config1, $config2);
print_r($mergedConfigOverwrite);
/* Expected Output for custom function:
Array
(
[database] => Array
(
[host] => localhost
[port] => 3306
[user] => admin
[pass] => secret
)
[settings] => Array
(
[debug] =>
[logging] => 1
)
)
*/
?>
How it works: The `array_merge_recursive()` function merges elements or arrays from one or more arrays such that if a key exists in both, and the value is an array, it merges those arrays recursively. If the values are non-array types and have the same string key, the values are appended into a new array. This is useful for combining multi-level configuration arrays or deeply nested data structures. A custom function is also shown to demonstrate how to achieve an 'overwrite' behavior for scalar values when keys conflict, which is often desired in configuration merging.