1. <?php
  2. /**
  3. * Resolves dependencies of API responses for internal use with a dry-run mode.
  4. *
  5. * @param array $responses An array of API response data.
  6. * @param array $dependencies A map of dependencies, where keys are response IDs and values are arrays of required response IDs.
  7. * @param bool $dryRun Whether to perform a dry run (no actual API calls). Defaults to true.
  8. * @return array An array of resolved responses, where each response includes its dependencies. Returns an empty array if errors occur.
  9. */
  10. function resolveDependencies(array $responses, array $dependencies, bool $dryRun = true): array
  11. {
  12. $resolved = [];
  13. $visited = []; // Track visited responses to avoid infinite loops
  14. foreach ($responses as $id => $response) {
  15. if (in_array($id, $visited, true)) {
  16. // Skip already processed responses (prevent cycles)
  17. continue;
  18. }
  19. $visited[] = $id;
  20. $resolved[$id] = $response; // Initialize resolved response
  21. if ($dependencies[$id]) {
  22. $resolved[$id]['dependencies'] = [];
  23. foreach ($dependencies[$id] as $dependencyId) {
  24. if (array_key_exists($dependencyId, $responses)) {
  25. if ($dryRun) {
  26. $resolved[$id]['dependencies'][$dependencyId] = $responses[$dependencyId]; // Simulate dependency
  27. } else {
  28. $resolved[$id]['dependencies'][$dependencyId] = resolveDependencies([$dependencyId => $responses[$dependencyId]], $dependencies, false)[$dependencyId]; // Recursively resolve the dependency
  29. }
  30. } else {
  31. // Dependency not found - handle as needed (e.g., log error, return null, throw exception)
  32. error_log("Dependency not found for response ID: " . $id . " - ID: " . $dependencyId);
  33. $resolved[$id]['dependencies'] = ['error' => 'Dependency not found: ' . $dependencyId];
  34. }
  35. }
  36. }
  37. }
  38. return $resolved;
  39. }
  40. if (PHP_SAPI === 'cli') {
  41. // Example Usage (CLI)
  42. $responses = [
  43. 'a' => ['data' => 'Response A'],
  44. 'b' => ['data' => 'Response B'],
  45. 'c' => ['data' => 'Response C'],
  46. ];
  47. $dependencies = [
  48. 'b' => ['a'],
  49. 'c' => ['b', 'a'],
  50. ];
  51. $resolved = resolveDependencies($responses, $dependencies, true);
  52. print_r($resolved);
  53. }
  54. ?>

Add your comment