1. <?php
  2. /**
  3. * Resolves dependencies of collections for quick fixes with synchronous execution.
  4. *
  5. * @param array $collections An array of collections, where each collection is an array of items.
  6. * @return array An array of resolved collections. Returns an empty array if dependencies cannot be resolved.
  7. */
  8. function resolveDependencies(array $collections): array
  9. {
  10. $resolvedCollections = [];
  11. $dependencies = []; // Maps collection key to its dependencies (keys of other collections)
  12. // Build dependency map
  13. foreach ($collections as $collectionKey => $collection) {
  14. $dependencies[$collectionKey] = [];
  15. foreach ($collection as $item) {
  16. // Example: Item "A" depends on item "B" in another collection
  17. if (isset($item['depends_on'])) {
  18. $dependencies[$collectionKey][] = $item['depends_on'];
  19. }
  20. }
  21. }
  22. $resolved = []; // Keep track of collections that have been resolved.
  23. // Recursive function to resolve a collection
  24. function resolveCollection(string $collectionKey, array &$collections, array &$resolved): bool
  25. {
  26. if (in_array($collectionKey, $resolved)) {
  27. return true; // Already resolved
  28. }
  29. $collection = $collections[$collectionKey];
  30. $resolvedCollections[$collectionKey] = $collection; // Store the collection
  31. foreach ($collection as $item) {
  32. if (isset($item['depends_on'])) {
  33. $dependencyKey = $item['depends_on'];
  34. if (!isset($collections[$dependencyKey])) {
  35. // Dependency collection not found
  36. error_log("Dependency collection not found: " . $dependencyKey);
  37. return false;
  38. }
  39. if (!resolveCollection($dependencyKey, $collections, $resolved)) {
  40. return false; // Dependency resolution failed
  41. }
  42. }
  43. }
  44. return true; // Collection and its dependencies are resolved
  45. }
  46. // Resolve each collection
  47. foreach ($collections as $collectionKey => $collection) {
  48. if (!resolveCollection($collectionKey, $collections, $resolved)) {
  49. return []; // Return empty array if any dependency fails
  50. }
  51. }
  52. return $resolvedCollections;
  53. }
  54. //Example usage
  55. if(count($argv) > 1) {
  56. $collections = [
  57. 'collection1' => [
  58. ['name' => 'A'],
  59. ['name' => 'B']
  60. ],
  61. 'collection2' => [
  62. ['name' => 'C', 'depends_on' => 'collection1'],
  63. ['name' => 'D', 'depends_on' => 'collection1']
  64. ],
  65. 'collection3' => [
  66. ['name' => 'E', 'depends_on' => 'collection2']
  67. ]
  68. ];
  69. $resolved = resolveDependencies($collections);
  70. if(!empty($resolved)) {
  71. print_r($resolved);
  72. } else {
  73. echo "Dependency resolution failed.\n";
  74. }
  75. } else {
  76. echo "Usage: php script.php\n";
  77. }
  78. ?>

Add your comment