DependencyOrderingService
This class provides functionality to build an ordered list from a set of dependencies.
We use an adjacency matrix for the dependency graph (DAG)
Example structure of the DAG is: A => (A => FALSE, B => TRUE, C => FALSE) B => (A => FALSE, B => FALSE, C => FALSE) C => (A => TRUE, B => FALSE, C => FALSE)
A depends on B, C depends on A, B is independent
Table of Contents
Methods
- buildDependencyGraph() : array<string|int, array<string|int, bool>>
- Builds the dependency graph for the given dependencies
- calculateOrder() : array<string|int, mixed>
- Calculate an ordered list for a dependencyGraph
- findRootIds() : array<string|int, mixed>
- Find all root nodes of a graph
- orderByDependencies() : array<string|int, mixed>
- Order items by specified dependencies before/after
- findPathInGraph() : array<string|int, mixed>
- Find any path in the graph from given start node to destination node
- getIncomingEdgeCount() : int
- Get the number of incoming edges in the dependency graph for given identifier
- prepareDependencies() : array<string|int, mixed>
- Prepare dependencies
Methods
buildDependencyGraph()
Builds the dependency graph for the given dependencies
public
buildDependencyGraph(array<string|int, mixed> $dependencies[, string $beforeKey = 'before' ][, string $afterKey = 'after' ]) : array<string|int, array<string|int, bool>>
The dependencies have to specified in the following structure: $dependencies = [ 'someKey' => [ 'before' => ['someKeyA', 'someKeyB'] 'after' => ['someKeyC'] ] ]
We interpret a dependency like 'A' => [ 'before' => ['B'], 'after' => ['C', 'D'] ] as
- A depends on C
- A depends on D
- B depends on A
Parameters
- $dependencies : array<string|int, mixed>
- $beforeKey : string = 'before'
-
The key to use in a dependency which specifies the "before"-relation. eg. 'sortBefore', 'loadBefore'
- $afterKey : string = 'after'
-
The key to use in a dependency which specifies the "after"-relation. eg. 'sortAfter', 'loadAfter'
Return values
array<string|int, array<string|int, bool>> —The dependency graph
calculateOrder()
Calculate an ordered list for a dependencyGraph
public
calculateOrder(array<string|int, array<string|int, bool>> $dependencyGraph) : array<string|int, mixed>
Parameters
- $dependencyGraph : array<string|int, array<string|int, bool>>
Tags
Return values
array<string|int, mixed> —Sorted array of keys of $dependencies
findRootIds()
Find all root nodes of a graph
public
findRootIds(array<string|int, array<string|int, bool>> $dependencyGraph) : array<string|int, mixed>
Root nodes are those, where nothing else depends on (they can be the last in the loading order). If there are no dependencies at all, all nodes are root nodes.
Parameters
- $dependencyGraph : array<string|int, array<string|int, bool>>
Return values
array<string|int, mixed> —List of identifiers which are root nodes
orderByDependencies()
Order items by specified dependencies before/after
public
orderByDependencies(array<string|int, mixed> $items[, string $beforeKey = 'before' ][, string $afterKey = 'after' ]) : array<string|int, mixed>
The dependencies of an items are specified as: 'someItemKey' => [ 'before' => ['someItemKeyA', 'someItemKeyB'] 'after' => ['someItemKeyC'] ]
If your items use different keys for specifying the relations, you can define the appropriate keys by setting the $beforeKey and $afterKey parameters accordingly.
Parameters
- $items : array<string|int, mixed>
- $beforeKey : string = 'before'
-
The key to use in a dependency which specifies the "before"-relation. eg. 'sortBefore', 'loadBefore'
- $afterKey : string = 'after'
-
The key to use in a dependency which specifies the "after"-relation. eg. 'sortAfter', 'loadAfter'
Tags
Return values
array<string|int, mixed>findPathInGraph()
Find any path in the graph from given start node to destination node
protected
findPathInGraph(array<string|int, mixed> $graph, string $from, string $to) : array<string|int, mixed>
Parameters
- $graph : array<string|int, mixed>
-
Directed graph
- $from : string
-
Start node
- $to : string
-
Destination node
Return values
array<string|int, mixed> —Nodes of the found path; empty if no path is found
getIncomingEdgeCount()
Get the number of incoming edges in the dependency graph for given identifier
protected
getIncomingEdgeCount(array<string|int, mixed> $dependencyGraph, string $identifier) : int
Parameters
- $dependencyGraph : array<string|int, mixed>
- $identifier : string
Return values
intprepareDependencies()
Prepare dependencies
protected
prepareDependencies(array<string|int, mixed> $dependencies[, string $beforeKey = 'before' ][, string $afterKey = 'after' ]) : array<string|int, mixed>
Ensure that all discovered identifiers are added to the dependency list so we can reliably use the identifiers to build the matrix. Additionally fix all invalid or missing before/after arrays
Parameters
- $dependencies : array<string|int, mixed>
- $beforeKey : string = 'before'
-
The key to use in a dependency which specifies the "before"-relation. eg. 'sortBefore', 'loadBefore'
- $afterKey : string = 'after'
-
The key to use in a dependency which specifies the "after"-relation. eg. 'sortAfter', 'loadAfter'
Return values
array<string|int, mixed> —Prepared dependencies