Completed
Pull Request — master (#14)
by Daniel
09:39
created

Traverse::where()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 3

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 12
ccs 8
cts 8
cp 1
rs 9.4285
cc 3
eloc 6
nc 3
nop 2
crap 3
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
            if (empty($array)) {
123
                return value($default);
124
            }
125
126
            foreach ($array as $item) {
127
                return $item;
128
            }
129
        }
130
131 2
        foreach ($array as $key => $value) {
132 2
            if (call_user_func($callback, $key, $value)) {
133 2
                return $value;
134
            }
135 1
        }
136
137 1
        return $this->value($default);
138
    }
139
140
    /**
141
     * Return the last element in an array passing a given truth test.
142
     *
143
     * @param array    $array
144
     * @param callable $callback
145
     * @param mixed    $default
146
     *
147
     * @return mixed
148
     */
149 1
    public function last(array $array, callable $callback, $default = null)
150
    {
151 1
        if (is_null($callback)) {
152
            return empty($array) ? $this->value($default) : end($array);
153
        }
154
155 1
        return $this->first(array_reverse($array), $callback, $default);
156
    }
157
}
158