Completed
Push — master ( aba289...58e266 )
by Ventaquil
02:10
created

Graph::addConnection()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 12
c 0
b 0
f 0
rs 9.4285
cc 2
eloc 6
nc 2
nop 1
1
<?php
2
3
namespace PHPAlgorithms\GraphTools;
4
5
use PHPAlgorithms\GraphTools\Abstracts\BuildableAbstract;
6
use PHPAlgorithms\GraphTools\Graph\Connection;
7
use PHPAlgorithms\GraphTools\Graph\Node;
8
9
/**
10
 * Class Graph
11
 * @package PHPAlgorithms\GraphTools
12
 * @method Node[] getNodes()
13
 * @property-read Node[] $nodes
14
 */
15
class Graph extends BuildableAbstract
16
{
17
    /**
18
     * @var string[] $allowedGet
19
     */
20
    protected $allowedGet = array('nodes');
21
22
    /**
23
     * @var Connection[] $connections
24
     */
25
    protected $connections;
26
27
    /**
28
     * @var Node[] $nodes
29
     */
30
    protected $nodes;
31
32
    /**
33
     * Graph constructor.
34
     * @param Node[] $nodes
35
     * @param Connection[] $connections
36
     */
37
    public function __construct(array $nodes, array $connections)
38
    {
39
        foreach ($nodes as $node) {
40
            $this->addNode($node);
41
        }
42
43
        foreach ($connections as $connection) {
44
            $this->addConnection($connection);
45
        }
46
    }
47
48
    /**
49
     * @param Connection $connection
50
     * @return Graph
51
     */
52
    protected function addConnection(Connection $connection) : Graph
53
    {
54
        $this->addNode($connection->from)->addNode($connection->to);
55
56
        if (!isset($this->connections[$connection->from->id][$connection->to->id])) {
57
            $this->connections[$connection->from->id][$connection->to->id] = array();
58
        }
59
60
        $this->connections[$connection->from->id][$connection->to->id][] = $connection;
61
62
        return $this;
63
    }
64
65
    /**
66
     * @param Node $node
67
     * @return Graph
68
     */
69
    protected function addNode(Node $node) : Graph
70
    {
71
        if (!isset($this->nodes[$node->id])) {
72
            $this->nodes[$node->id] = $node;
73
        }
74
75
        return $this;
76
    }
77
78
    /**
79
     * @param Node $from
80
     * @param Node $to
81
     * @return Connection[]
82
     */
83
    public function getDistances(Node $from, Node $to) : array
84
    {
85
        if (isset($this->connections[$from->id][$to->id])) {
86
            return $this->connections[$from->id][$to->id];
87
        }
88
89
        return array();
90
    }
91
92
    /**
93
     * @param Node $node
94
     * @return Node[]
95
     */
96
    public function getNeighbour(Node $node) : array
97
    {
98
        $neighbour = array();
99
100
        if (isset($this->connections[$node->id])) {
101
            $ids = array_keys($this->connections[$node->id]);
102
103
            foreach ($this->nodes as $node) {
104
                if (in_array($node->id, $ids)) {
105
                    $neighbour[] = $node;
106
                }
107
            }
108
        }
109
110
        return $neighbour;
111
    }
112
}
113