<?php
/**
* Resolves dependencies of log streams for diagnostics.
*
* @param array $logStreams An array of log stream objects.
* @return array An array of resolved log streams, sorted by dependency order.
*/
function resolveLogStreamDependencies(array $logStreams): array
{
$resolvedStreams = [];
$dependencies = [];
// Build dependency map. Key: stream name, Value: array of dependencies.
foreach ($logStreams as $stream) {
if (isset($stream->dependencies)) {
$dependencies[$stream->name] = $stream->dependencies;
} else {
$dependencies[$stream->name] = []; // No dependencies
}
}
$visited = []; // Keep track of visited streams to avoid cycles
// Recursive function to resolve dependencies
function resolve(string $streamName): void
{
if (in_array($streamName, $visited)) {
return; // Avoid infinite loops
}
$visited[] = $streamName;
$stream = null;
foreach ($logStreams as $s) {
if ($s->name === $streamName) {
$stream = $s;
break;
}
}
if ($stream === null) {
return; // Stream not found, should not happen if data is valid
}
// Resolve dependencies for this stream
foreach ($dependencies[$streamName] as $dependencyName) {
resolve($dependencyName);
}
// Add the resolved stream to the resolved list
$resolvedStreams[] = $stream;
}
// Iterate through all streams and resolve them
foreach ($logStreams as $stream) {
if (!in_array($stream->name, $visited)) {
resolve($stream->name);
}
}
// Sort the resolved streams based on their names for consistent output
usort($resolvedStreams, function ($a, $b) {
return strcmp($a->name, $b->name);
});
return $resolvedStreams;
}
/**
* Example Log Stream class (for testing)
*/
class LogStream
{
public string $name;
public array $dependencies = [];
public function __construct(string $name, array $dependencies = [])
{
$this->name = $name;
$this->dependencies = $dependencies;
}
}
?>
Add your comment