PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backups, Restore, Migration & Clone / 4.11.0
WP STAGING – WordPress Backups, Restore, Migration & Clone v4.11.0
4.11.0 4.10.0 4.9.5 4.9.4 4.9.3 4.9.2 4.9.1 4.9.0 4.8.1 trunk 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.10.0 3.2.0 3.3.1 3.3.2 3.3.3 3.4.1 3.4.3 3.5.0 3.6.0 3.7.1 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.8.6 3.8.7 3.9.0 3.9.1 3.9.2 3.9.3 3.9.4 4.0.0 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.8.0
wp-staging / Framework / DependencyResolver / DependencyResolver.php
wp-staging / Framework / DependencyResolver Last commit date
Exceptions 1 day ago DependencyResolver.php 1 day ago ResolveBehaviour.php 1 day ago
DependencyResolver.php
94 lines
1 <?php
2
3 namespace WPStaging\Framework\DependencyResolver;
4
5 use WPStaging\Framework\DependencyResolver\Exceptions\CircularReferenceException;
6 use WPStaging\Framework\DependencyResolver\Exceptions\MissingReferenceException;
7 use WPStaging\Framework\DependencyResolver\Exceptions\ResolveException;
8
9
10
11
12
13
14
15
16 class DependencyResolver
17 {
18
19
20
21
22 public static function resolve(array $tree, $resolveBehaviour = null)
23 {
24 if (is_null($resolveBehaviour)) {
25 $resolveBehaviour = ResolveBehaviour::create()->setThrowOnCircularReference(true);
26 }
27
28 $resolved = [];
29 $unresolved = [];
30
31
32 foreach (array_keys($tree) as $table) {
33 list($resolved, $unresolved, $returnImmediately) = self::resolver($table, $tree, $resolved, $unresolved, $resolveBehaviour);
34
35 if ($returnImmediately) {
36 return $resolved;
37 }
38 }
39
40 return $resolved;
41 }
42
43
44
45
46
47
48 private static function resolver($item, array $items, array $resolved, array $unresolved, ResolveBehaviour $resolveBehaviour)
49 {
50 $unresolved[] = $item;
51
52 foreach ($items[$item] as $dep) {
53 if (!array_key_exists($dep, $items)) {
54 if ($resolveBehaviour->isThrowOnMissingReference()) {
55 throw new MissingReferenceException($item, $dep);
56 }
57
58 return [$resolved, $unresolved, true];
59 }
60
61 if (in_array($dep, $resolved, true)) {
62 continue;
63 }
64
65 if (in_array($dep, $unresolved, true)) {
66 if ($resolveBehaviour->isThrowOnCircularReference()) {
67 throw new CircularReferenceException($item, $dep);
68 }
69
70 return [$resolved, $unresolved, true];
71 }
72
73 $unresolved[] = $dep;
74 list($resolved, $unresolved, $returnImmediately) = self::resolver($dep, $items, $resolved, $unresolved, $resolveBehaviour);
75
76 if ($returnImmediately) {
77 return [$resolved, $unresolved, $returnImmediately];
78 }
79 }
80
81
82 if (!in_array($item, $resolved, true)) {
83 $resolved[] = $item;
84 }
85
86
87 while (($index = array_search($item, $unresolved, true)) !== false) {
88 unset($unresolved[$index]);
89 }
90
91 return [$resolved, $unresolved, false];
92 }
93 }
94