PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backups, Restore, Migration & Clone / 3.0.2
WP STAGING – WordPress Backups, Restore, Migration & Clone v3.0.2
4.11.2 4.11.1 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 5 years ago DependencyResolver.php 5 years ago ResolveBehaviour.php 5 years ago
DependencyResolver.php
92 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 * Class DependencyResolver
11 *
12 * This is a port of https://github.com/anthonykgross/dependency-resolver, adapted to run on our PHP requirement version.
13 *
14 * @package WPStaging\Framework\DependencyResolver
15 */
16 class DependencyResolver
17 {
18 /**
19 * @throws ResolveException
20 */
21 public static function resolve(array $tree, ResolveBehaviour $resolveBehaviour = null)
22 {
23 if (is_null($resolveBehaviour)) {
24 $resolveBehaviour = ResolveBehaviour::create()->setThrowOnCircularReference(true);
25 }
26 $resolved = [];
27 $unresolved = [];
28
29 // Resolve dependencies for each table
30 foreach (array_keys($tree) as $table) {
31 list($resolved, $unresolved, $returnImmediately) = self::resolver($table, $tree, $resolved, $unresolved, $resolveBehaviour);
32
33 if ($returnImmediately) {
34 return $resolved;
35 }
36 }
37
38 return $resolved;
39 }
40
41 /**
42 * @param int|string $item
43 *
44 * @throws ResolveException
45 */
46 private static function resolver($item, array $items, array $resolved, array $unresolved, ResolveBehaviour $resolveBehaviour)
47 {
48 $unresolved[] = $item;
49
50 foreach ($items[$item] as $dep) {
51 if (!array_key_exists($dep, $items)) {
52 if ($resolveBehaviour->isThrowOnMissingReference()) {
53 throw new MissingReferenceException($item, $dep);
54 }
55
56 return [$resolved, $unresolved, true];
57 }
58
59 if (in_array($dep, $resolved, true)) {
60 continue;
61 }
62
63 if (in_array($dep, $unresolved, true)) {
64 if ($resolveBehaviour->isThrowOnCircularReference()) {
65 throw new CircularReferenceException($item, $dep);
66 }
67
68 return [$resolved, $unresolved, true];
69 }
70
71 $unresolved[] = $dep;
72 list($resolved, $unresolved, $returnImmediately) = self::resolver($dep, $items, $resolved, $unresolved, $resolveBehaviour);
73
74 if ($returnImmediately) {
75 return [$resolved, $unresolved, $returnImmediately];
76 }
77 }
78
79 // Add $item to $resolved if it's not already there
80 if (!in_array($item, $resolved, true)) {
81 $resolved[] = $item;
82 }
83
84 // Remove all occurrences of $item in $unresolved
85 while (($index = array_search($item, $unresolved, true)) !== false) {
86 unset($unresolved[$index]);
87 }
88
89 return [$resolved, $unresolved, false];
90 }
91 }
92