Completed
Push — master ( 4e6918...b139e2 )
by Daniel
02:41
created

Transform   A

Complexity

Total Complexity 31

Size/Duplication

Total Lines 210
Duplicated Lines 6.67 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 7
Bugs 2 Features 4
Metric Value
wmc 31
c 7
b 2
f 4
lcom 1
cbo 1
dl 14
loc 210
rs 9.8

9 Methods

Rating   Name   Duplication   Size   Complexity  
A swap() 0 4 1
A collapse() 0 14 3
A divide() 0 4 1
A reindex() 0 14 4
B merge() 0 16 5
A dot() 7 20 4
A flatten() 7 14 3
A combine() 0 15 4
B extend() 0 16 6

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
namespace Narrowspark\Arr;
3
4
use Narrowspark\Arr\Traits\SplitPathTrait;
5
use Narrowspark\Arr\Traits\ValueTrait;
6
7
class Transform
8
{
9
    /**
10
     * Dotted array cache.
11
     *
12
     * @var array
13
     */
14
    protected $dotted = [];
15
16
    /**
17
     * Swap two elements between positions.
18
     *
19
     * @param array  $array array to swap
20
     * @param string $swapA
21
     * @param string $swapB
22
     *
23
     * @return array|null
24
     */
25
    public function swap(array $array, $swapA, $swapB)
26
    {
27
        list($array[$swapA], $array[$swapB]) = [$array[$swapB], $array[$swapA]];
28
    }
29
30
    /**
31
     * Indexes an array depending on the values it contains.
32
     *
33
     * @param array    $array
34
     * @param callable $callback  Function to combine values.
35
     * @param bool     $overwrite Should duplicate keys be overwritten?
36
     *
37
     * @return array Indexed values.
38
     */
39
    public function combine(array $array, callable $callback, $overwrite = true)
40
    {
41
        $combined = [];
42
43
        foreach ($array as $key => $value) {
44
            $combinator = call_user_func($callback, $value, $key);
45
            $index      = $combinator->key();
46
47
            if ($overwrite || !isset($combined[$index])) {
48
                $combined[$index] = $combinator->current();
49
            }
50
        }
51
52
        return $combined;
53
    }
54
55
    /**
56
     * Collapse an array of arrays into a single array.
57
     *
58
     * @param array $array
59
     *
60
     * @return array
61
     */
62
    public function collapse(array $array)
63
    {
64
        $results = [];
65
66
        foreach ($array as $values) {
67
            if (!is_array($values)) {
68
                continue;
69
            }
70
71
            $results = array_merge($results, $values);
72
        }
73
74
        return $results;
75
    }
76
77
    /**
78
     * Divide an array into two arrays. One with keys and the other with values.
79
     *
80
     * @param array $array
81
     *
82
     * @return array[]
83
     */
84
    public function divide($array)
85
    {
86
        return [array_keys($array), array_values($array)];
87
    }
88
89
    /**
90
     * Reindexes a list of values.
91
     *
92
     * @param array $array
93
     * @param array $map          An map of correspondances of the form
94
     *                            ['currentIndex' => 'newIndex'].
95
     * @param bool  $keepUnmapped Whether or not to keep keys that are not
96
     *                            remapped.
97
     *
98
     * @return array
99
     */
100
    public function reindex(array $array, array $map, $keepUnmapped = true)
101
    {
102
        $reindexed = $keepUnmapped
103
            ? $array
104
            : [];
105
106
        foreach ($map as $from => $to) {
107
            if (isset($array[$from])) {
108
                $reindexed[$to] = $array[$from];
109
            }
110
        }
111
112
        return $reindexed;
113
    }
114
115
    /**
116
     * Merges two arrays recursively.
117
     *
118
     * @param array $first  Original data.
119
     * @param array $second Data to be merged.
120
     *
121
     * @return array
122
     */
123
    public function merge(array $first, array $second)
124
    {
125
        foreach ($second as $key => $value) {
126
            $shouldBeMerged = (
127
                isset($first[$key])
128
                && is_array($first[$key])
129
                && is_array($value)
130
            );
131
132
            $first[$key] = $shouldBeMerged
133
                ? $this->merge($first[$key], $value)
134
                : $value;
135
        }
136
137
        return $first;
138
    }
139
140
    /**
141
     * Extend one array with another.
142
     *
143
     * @param array $arrays
144
     *
145
     * @return array
146
     */
147
    public function extend(array $arrays)
1 ignored issue
show
Unused Code introduced by
The parameter $arrays is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
148
    {
149
        $merged = [];
150
151
        foreach (func_get_args() as $array) {
152
            foreach ($array as $key => $value) {
153
                if (is_array($value) && (new Access())->has($merged, $key) && is_array($merged[$key])) {
154
                    $merged[$key] = $this->extend($merged[$key], $value);
155
                } else {
156
                    $merged[$key] = $value;
157
                }
158
            }
159
        }
160
161
        return $merged;
162
    }
163
164
    /**
165
     * Flatten a multi-dimensional associative array with dots.
166
     *
167
     * @param array  $array
168
     * @param string $prepend
169
     *
170
     * @return array
171
     */
172
    public function dot($array, $prepend = '')
173
    {
174
        $cache = serialize(['array' => $array, 'prepend' => $prepend]);
175
176
        if (array_key_exists($cache, $this->dotted)) {
177
            return $this->dotted[$cache];
178
        }
179
180
        $results = [];
181
182 View Code Duplication
        foreach ($array as $key => $value) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
183
            if (is_array($value)) {
184
                $results = array_merge($results, $this->dot($value, $prepend . $key . '.'));
185
            } else {
186
                $results[$prepend . $key] = $value;
187
            }
188
        }
189
190
        return $this->dotted[$cache] = $results;
191
    }
192
193
    /**
194
     * Flatten a nested array to a separated key.
195
     *
196
     * @param array       $array
197
     * @param string|null $separator
198
     * @param string      $prepend
199
     *
200
     * @return array
201
     */
202
    public function flatten(array $array, $separator = null, $prepend = '')
203
    {
204
        $flattened = [];
205
206 View Code Duplication
        foreach ($array as $key => $value) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
207
            if (is_array($value)) {
208
                $flattened = array_merge($flattened, $this->flatten($value, $separator, $prepend . $key . $separator));
209
            } else {
210
                $flattened[$prepend . $key] = $value;
211
            }
212
        }
213
214
        return $flattened;
215
    }
216
}
217