function array_merge_recursive_config(array $array1, array $array2) { $merged = $array1; foreach ($array2 as $key => &$value) { if (is_null($value)) { // we want to unset the key in $array1 unset($merged[$key]); } elseif (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) { $merged[$key] = array_merge_recursive_config($merged[$key], $value); } else { $merged[$key] = $value; } } return $merged; }
protected function mergeConfigsFromPath($path) { $configs = []; $ids = []; $dependencies = []; // read the differents config files foreach (glob($path . '/*.config.php') as $configFile) { $id = basename($configFile, '.config.php'); $configs[$id] = (include $configFile); $ids[] = $id; if (isset($configs[$id]['_import'])) { $configs[$id]['_import'] = (array) $configs[$id]['_import']; foreach ($configs[$id]['_import'] as $dependency) { $dependencies[] = [$dependency, $id]; } unset($configs[$id]['_import']); } } if (count($configs) > 1) { $ids = \topological_sort($ids, $dependencies); if (empty($ids)) { throw new \RuntimeException('Cannot sort configs'); } } // merge them in a logical order $config = []; foreach ($ids as $id) { $config = \array_merge_recursive_config($config, $configs[$id]); } return $config; }