1. <?php
  2. /**
  3. * Resolves dependencies of strings.
  4. *
  5. * @param array $strings An array of strings, where each string may have a 'depends_on' key.
  6. * @return array An array of strings with resolved dependencies. Returns original array if errors occur.
  7. */
  8. function resolveStringDependencies(array $strings): array
  9. {
  10. $resolvedStrings = [];
  11. $dependencies = [];
  12. // First pass: Collect all dependencies
  13. foreach ($strings as $string) {
  14. if (isset($string['depends_on']) && is_array($string['depends_on'])) {
  15. $dependencies = array_merge($dependencies, $string['depends_on']);
  16. }
  17. }
  18. $resolvedStrings = $strings; // Start with a copy
  19. $changed = true;
  20. while ($changed) {
  21. $changed = false;
  22. foreach ($resolvedStrings as $string) {
  23. if (isset($string['depends_on']) && is_array($string['depends_on'])) {
  24. $canResolve = true;
  25. foreach ($string['depends_on'] as $dependency) {
  26. if (!isset($resolvedStrings[$dependency])) {
  27. // Dependency not found, cannot resolve
  28. $canResolve = false;
  29. break;
  30. }
  31. }
  32. if ($canResolve) {
  33. // Resolve dependencies
  34. foreach ($string['depends_on'] as $dependency) {
  35. $string['resolved_value'] = $resolvedStrings[$dependency]; // Store resolved value for debugging
  36. unset($string['depends_on']); // Remove dependency after resolving
  37. }
  38. $changed = true;
  39. }
  40. }
  41. }
  42. }
  43. return $resolvedStrings;
  44. }
  45. //Example Usage (for testing)
  46. /*
  47. $strings = [
  48. ['name' => 'A', 'depends_on' => ['B', 'C']],
  49. ['name' => 'B', 'depends_on' => ['D']],
  50. ['name' => 'C', 'depends_on' => []],
  51. ['name' => 'D', 'depends_on' => []],
  52. ['name' => 'E', 'depends_on' => ['A']],
  53. ];
  54. $resolved = resolveStringDependencies($strings);
  55. foreach ($resolved as $string) {
  56. echo "String: " . $string['name'] . ", Resolved Value: " . ($string['resolved_value'] ?? 'N/A') . PHP_EOL;
  57. }
  58. */
  59. ?>

Add your comment