$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 * * @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 * * @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) { $sourceIsValid = false; $foundPath = false; foreach ($validPaths as $tPath => $tValue) { if (!$foundPath && ($tPath === $sPath || \preg_match('~' . \str_replace('/', '\\/', $tPath) . '~', $sPath) === 1) ) { $foundPath = true; } if (($tPath === $sPath || \preg_match('~' . \str_replace('/', '\\/', $tPath) . '~', $sPath) === 1) && ($tValue === $sValue || \preg_match('~' . ((string) $tValue) . '~', (string) $sValue) === 1) ) { $sourceIsValid = true; break; } } if (!$sourceIsValid && $foundPath) { return false; } } return true; } }