Completed
Pull Request — master (#14)
by Daniel
08:46
created

Traverse::first()   B

Complexity

Conditions 5
Paths 5

Size

Total Lines 14
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 5.0488

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 14
ccs 7
cts 8
cp 0.875
rs 8.8571
cc 5
eloc 7
nc 5
nop 3
crap 5.0488
1
<?php
2
namespace Narrowspark\Arr;
3
4
use Narrowspark\Arr\Traits\ValueTrait;
5
6
class Traverse
7
{
8
    use ValueTrait;
9
10
    /**
11
     * Applies the callback to the elements of the given arrays
12
     *
13
     * @param array    $array
14
     * @param callable $callback
15
     *
16
     * @return array
17
     */
18 1
    public function map(array $array, callable $callback)
19
    {
20 1
        $newArray = [];
21
22 1
        foreach ($array as $key => $item) {
23 1
            $result = call_user_func($callback, $item, $key);
24
25 1
            $newArray = is_array($result) ?
26 1
                array_replace_recursive($array, $result) :
27 1
                array_merge_recursive($array, (array) $result);
28 1
        }
29
30 1
        return $newArray;
31
    }
32
33
    /**
34
     * Filters each of the given values through a function.
35
     *
36
     * @param array    $array
37
     * @param callable $callback
38
     *
39
     * @return array
40
     */
41 2
    public function filter(array $array, callable $callback)
42
    {
43 2
        $newArray = [];
44
45 2
        foreach ($array as $key => $item) {
46 2
            if (call_user_func($callback, $item, $key)) {
47 2
                $newArray[$key] = $item;
48 2
            }
49 2
        }
50
51 2
        return $newArray;
52
    }
53
54
    /**
55
     * Returns whether every element of the array satisfies the given predicate or not.
56
     * Works with Iterators too.
57
     *
58
     * @param array    $array
59
     * @param callable $predicate
60
     *
61
     * @return bool
62
     */
63 1
    public function all(array $array, callable $predicate)
64
    {
65 1
        foreach ($array as $key => $value) {
66 1
            if (! call_user_func($predicate, $value, $key, $array)) {
67 1
                return false;
68
            }
69 1
        }
70
71 1
        return true;
72
    }
73
74
    /**
75
     *  The opposite of filter().
76
     *
77
     *  @param array    $array
78
     *  @param callable $callback Function to filter values.
79
     *
80
     *  @return array filtered array.
81
     */
82
    public function reject(array $array, callable $callback)
83
    {
84 1
        return $this->filter($array, function ($value, $key) use ($callback) {
85 1
            return ! call_user_func($callback, $value, $key);
86 1
        });
87
    }
88
89
    /**
90
     * Filter the array using the given Closure.
91
     *
92
     * @param array    $array
93
     * @param callable $callback
94
     *
95
     * @return array
96
     */
97 1
    public function where(array $array, callable $callback)
98
    {
99 1
        $filtered = [];
100
101 1
        foreach ($array as $key => $value) {
102 1
            if (call_user_func($callback, $key, $value)) {
103 1
                $filtered[$key] = $value;
104 1
            }
105 1
        }
106
107 1
        return $filtered;
108
    }
109
110
    /**
111
     * Return the first element in an array passing a given truth test.
112
     *
113
     * @param array    $array
114
     * @param callable $callback
115
     * @param mixed    $default
116
     *
117
     * @return mixed
118
     */
119 2
    public function first(array $array, callable $callback, $default = null)
120
    {
121 2
        if (is_null($callback)) {
122
            return empty($array) ? $this->value($default) : reset($array);
123
        }
124
125 2
        foreach ($array as $key => $value) {
126 2
            if (call_user_func($callback, $key, $value)) {
127 2
                return $value;
128
            }
129 1
        }
130
131 1
        return $this->value($default);
132
    }
133
134
    /**
135
     * Return the last element in an array passing a given truth test.
136
     *
137
     * @param array    $array
138
     * @param callable $callback
139
     * @param mixed    $default
140
     *
141
     * @return mixed
142
     */
143 1
    public function last(array $array, callable $callback, $default = null)
144
    {
145 1
        if (is_null($callback)) {
146
            return empty($array) ? $this->value($default) : end($array);
147
        }
148
149 1
        return $this->first(array_reverse($array), $callback, $default);
150
    }
151
}
152