definitions; } /** * @return SettingValue[] */ public function getProvidedSettings(array $currentDefinitions): array { // Obtain default settings /** @var SettingValue[] $defaultSettings */ $defaultSettings = []; foreach ($this->definitions as $definition) { $defaultSettings[] = new SettingValue( value: $definition->default, key: $definition->key, definition: $definition, ); } // Obtain defined setting values from map presentation /** @var SettingValue[] $settings */ $settings = []; $treeSettings = $this->settings; foreach ($this->settings as $key => $value) { $definition = $currentDefinitions[$key] ?? null; if ($definition !== null) { $settings[] = new SettingValue( value: $value, key: $key, definition: $definition, ); // A setting that is defined, is not to be interpreted as an anonymous legacy tree setting // (otherwise the key would be duplicated, but with dots being escaped) unset($treeSettings[$key]); } } // Obtain defined setting values from tree presentation /** @var SettingValue[] $legacySettings */ $legacySettings = []; foreach ($currentDefinitions as $definition) { if (!ArrayUtility::isValidPath($treeSettings, $definition->key, '.')) { continue; } $value = ArrayUtility::getValueByPath($treeSettings, $definition->key, '.'); $treeSettings = ArrayUtility::removeByPath($treeSettings, $definition->key, '.'); $legacySettings[] = new SettingValue( value: $value, key: $definition->key, definition: $definition, ); } // Derive anonymous setting values from tree by mapping tree nodes to dots $flatSettings = ArrayUtility::flattenPlain($treeSettings); foreach ($flatSettings as $key => $value) { $legacySettings[] = new SettingValue( value: $value, key: $key, definition: null, ); } return [ ...$defaultSettings, ...$legacySettings, ...$settings, ]; } }