<?php
/**
* Resolves dependencies of API responses for internal use with a dry-run mode.
*
* @param array $responses An array of API response data.
* @param array $dependencies A map of dependencies, where keys are response IDs and values are arrays of required response IDs.
* @param bool $dryRun Whether to perform a dry run (no actual API calls). Defaults to true.
* @return array An array of resolved responses, where each response includes its dependencies. Returns an empty array if errors occur.
*/
function resolveDependencies(array $responses, array $dependencies, bool $dryRun = true): array
{
$resolved = [];
$visited = []; // Track visited responses to avoid infinite loops
foreach ($responses as $id => $response) {
if (in_array($id, $visited, true)) {
// Skip already processed responses (prevent cycles)
continue;
}
$visited[] = $id;
$resolved[$id] = $response; // Initialize resolved response
if ($dependencies[$id]) {
$resolved[$id]['dependencies'] = [];
foreach ($dependencies[$id] as $dependencyId) {
if (array_key_exists($dependencyId, $responses)) {
if ($dryRun) {
$resolved[$id]['dependencies'][$dependencyId] = $responses[$dependencyId]; // Simulate dependency
} else {
$resolved[$id]['dependencies'][$dependencyId] = resolveDependencies([$dependencyId => $responses[$dependencyId]], $dependencies, false)[$dependencyId]; // Recursively resolve the dependency
}
} else {
// Dependency not found - handle as needed (e.g., log error, return null, throw exception)
error_log("Dependency not found for response ID: " . $id . " - ID: " . $dependencyId);
$resolved[$id]['dependencies'] = ['error' => 'Dependency not found: ' . $dependencyId];
}
}
}
}
return $resolved;
}
if (PHP_SAPI === 'cli') {
// Example Usage (CLI)
$responses = [
'a' => ['data' => 'Response A'],
'b' => ['data' => 'Response B'],
'c' => ['data' => 'Response C'],
];
$dependencies = [
'b' => ['a'],
'c' => ['b', 'a'],
];
$resolved = resolveDependencies($responses, $dependencies, true);
print_r($resolved);
}
?>
Add your comment