GraphTraversePath::toArray()   A
last analyzed

Complexity

Conditions 5
Paths 6

Size

Total Lines 17
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 9
c 1
b 0
f 0
dl 0
loc 17
rs 9.6111
cc 5
nc 6
nop 1
1
<?php
2
3
namespace Smoren\Containers\Structs;
4
5
use ArrayIterator;
6
use Countable;
7
use IteratorAggregate;
8
9
class GraphTraversePath implements IteratorAggregate, Countable
10
{
11
    /**
12
     * @var GraphLink[]
13
     */
14
    protected array $links;
15
16
    /**
17
     * GraphTraversePath constructor.
18
     * @param GraphLink[] $links
19
     */
20
    public function __construct(array $links)
21
    {
22
        $this->links = $links;
23
    }
24
25
    /**
26
     * Returns first item of path
27
     * @return GraphItem
28
     */
29
    public function getFirstItem(): GraphItem
30
    {
31
        return $this->links[0]->getLeftItem();
32
    }
33
34
    /**
35
     * Returns last item of path
36
     * @return GraphItem
37
     */
38
    public function getLastItem(): GraphItem
39
    {
40
        return $this->links[count($this->links)-1]->getRightItem();
41
    }
42
43
    /**
44
     * Reverse path
45
     * @param bool $clone need clone object
46
     * @param bool $cloneItems need clone items
47
     * @return GraphTraversePath
48
     */
49
    public function reverse(bool $clone = false, bool $cloneItems = false): self
50
    {
51
        if($clone) {
52
            $path = clone $this;
53
        } else {
54
            $path = $this;
55
        }
56
57
        $path->links = array_reverse($path->links);
58
59
        foreach($path->links as $link) {
60
            $link->swap($cloneItems);
61
        }
62
63
        return $path;
64
    }
65
66
    /**
67
     * @inheritDoc
68
     * @return ArrayIterator
69
     */
70
    public function getIterator(): ArrayIterator
71
    {
72
        return new ArrayIterator($this->links);
73
    }
74
75
    /**
76
     * @inheritDoc
77
     */
78
    public function count(): int
79
    {
80
        return count($this->links);
81
    }
82
83
    /**
84
     * Representates as array
85
     * @param bool $itemIdsOnly
86
     * @return array
87
     */
88
    public function toArray(bool $itemIdsOnly = false): array
89
    {
90
        $result = [];
91
92
        foreach($this->links as $link) {
93
            if($itemIdsOnly) {
94
                $result[] = $link->getLeftItem()->getId();
95
            } else {
96
                $result[] = $link->toArray();
97
            }
98
        }
99
100
        if($itemIdsOnly && isset($link)) {
101
            $result[] = $link->getRightItem()->getId();
102
        }
103
104
        return $result;
105
    }
106
107
    /**
108
     * Clones object
109
     */
110
    public function __clone()
111
    {
112
        foreach($this->links as $i => $link) {
113
            $this->links[$i] = clone $link;
114
        }
115
    }
116
}
117