$value) { $tempPath = $path . '/' . $key; if (\is_array($value)) { $paths += self::createAllViablePaths($value, $tempPath); } else { $paths[$tempPath] = $value; } } return $paths; } /** * Check if source array has additional elements. * * @param array $template Template structure * @param array $source Source structure * * @return bool Returns false in case of undefined elements * * @since 1.0.0 */ private static function hasTemplateDefinition(array $template, array $source) : bool { $completePaths = []; foreach ($template as $key => $value) { $key = \str_replace('/0', '/.*', $key); $completePaths[$key] = $value; } foreach ($source as $sPath => $sValue) { $hasDefinition = false; foreach ($completePaths as $tPath => $tValue) { if ($tPath === $sPath || \preg_match('~' . \str_replace('/', '\\/', $tPath) . '~', $sPath) === 1 ) { $hasDefinition = true; break; } } if (!$hasDefinition) { return false; } } return true; } /** * Check if source array is complete * * @param array $template Template structure * @param array $source Source structure * * @return bool Returns true if the source implements all required elements otherwise false is returned * * @since 1.0.0 */ private static function isCompleteSource(array $template, array $source) : bool { $completePaths = []; foreach ($template as $key => $value) { $key = \str_replace('/0', '/.*', $key); if (\stripos($key, '/.*') !== false) { continue; } $completePaths[$key] = $value; } foreach ($completePaths as $tPath => $tValue) { $sourceIsComplete = false; foreach ($source as $sPath => $sValue) { if ($tPath === $sPath || \preg_match('~' . \str_replace('/', '\\/', $tPath) . '~', $sPath) === 1 ) { unset($completePaths[$tPath]); break; } } } return \count($completePaths) === 0; } /** * Check if source array is correct * * @param array $template Template structure * @param array $source Source structure * * @return bool Returns true if the source is correct in relation to the template otherwise false is returned * * @since 1.0.0 */ private static function isValidSource(array $template, array $source) : bool { $validPaths = []; foreach ($template as $key => $value) { $key = \str_replace('/0', '/\d*', $key); $validPaths[$key] = $value; } foreach ($source as $sPath => $sValue) { $isValidValue = false; $pathFound = false; foreach ($validPaths as $tPath => $tValue) { if ($tPath === $sPath || \preg_match('~' . \str_replace('/', '\\/', $tPath) . '~', $sPath) === 1 ) { $pathFound = true; $sValue = StringUtils::stringify($sValue); if (($tValue === $sValue || \preg_match('~' . ((string) $tValue) . '~', (string) $sValue) === 1) ) { $isValidValue = true; break; } } } if (!$isValidValue && $pathFound) { return false; } } return true; } }