1. <?php
  2. /**
  3. * Resolves dependencies of log streams for diagnostics.
  4. *
  5. * @param array $logStreams An array of log stream objects.
  6. * @return array An array of resolved log streams, sorted by dependency order.
  7. */
  8. function resolveLogStreamDependencies(array $logStreams): array
  9. {
  10. $resolvedStreams = [];
  11. $dependencies = [];
  12. // Build dependency map. Key: stream name, Value: array of dependencies.
  13. foreach ($logStreams as $stream) {
  14. if (isset($stream->dependencies)) {
  15. $dependencies[$stream->name] = $stream->dependencies;
  16. } else {
  17. $dependencies[$stream->name] = []; // No dependencies
  18. }
  19. }
  20. $visited = []; // Keep track of visited streams to avoid cycles
  21. // Recursive function to resolve dependencies
  22. function resolve(string $streamName): void
  23. {
  24. if (in_array($streamName, $visited)) {
  25. return; // Avoid infinite loops
  26. }
  27. $visited[] = $streamName;
  28. $stream = null;
  29. foreach ($logStreams as $s) {
  30. if ($s->name === $streamName) {
  31. $stream = $s;
  32. break;
  33. }
  34. }
  35. if ($stream === null) {
  36. return; // Stream not found, should not happen if data is valid
  37. }
  38. // Resolve dependencies for this stream
  39. foreach ($dependencies[$streamName] as $dependencyName) {
  40. resolve($dependencyName);
  41. }
  42. // Add the resolved stream to the resolved list
  43. $resolvedStreams[] = $stream;
  44. }
  45. // Iterate through all streams and resolve them
  46. foreach ($logStreams as $stream) {
  47. if (!in_array($stream->name, $visited)) {
  48. resolve($stream->name);
  49. }
  50. }
  51. // Sort the resolved streams based on their names for consistent output
  52. usort($resolvedStreams, function ($a, $b) {
  53. return strcmp($a->name, $b->name);
  54. });
  55. return $resolvedStreams;
  56. }
  57. /**
  58. * Example Log Stream class (for testing)
  59. */
  60. class LogStream
  61. {
  62. public string $name;
  63. public array $dependencies = [];
  64. public function __construct(string $name, array $dependencies = [])
  65. {
  66. $this->name = $name;
  67. $this->dependencies = $dependencies;
  68. }
  69. }
  70. ?>

Add your comment