Passed
Push — master ( 3e60cb...36c2a1 )
by Paul
07:09 queued 03:38
created

Helper::getPathValue()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
eloc 6
nc 3
nop 3
dl 0
loc 10
ccs 7
cts 7
cp 1
crap 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace GeminiLabs\SiteReviews;
4
5
use GeminiLabs\SiteReviews\Database\Cache;
6
use GeminiLabs\Vectorface\Whip\Whip;
7
8
class Helper
9
{
10
	/**
11
	 * @param string $name
12
	 * @param string $path
13
	 * @return string
14
	 */
15 4
	public function buildClassName( $name, $path = '' )
16
	{
17 4
		$className = $this->camelCase( $name );
18 4
		$path = ltrim( str_replace( __NAMESPACE__, '', $path ), '\\' );
19 4
		return !empty( $path )
20 2
			? __NAMESPACE__.'\\'.$path.'\\'.$className
21 4
			: $className;
22
	}
23
24
	/**
25
	 * @param string $name
26
	 * @param string $prefix
27
	 * @return string
28
	 */
29 2
	public function buildMethodName( $name, $prefix = '' )
30
	{
31 2
		return lcfirst( $prefix.$this->buildClassName( $name ));
32
	}
33
34
	/**
35
	 * @param string $name
36
	 * @return string
37
	 */
38 1
	public function buildPropertyName( $name )
39
	{
40 1
		return lcfirst( $this->buildClassName( $name ));
41
	}
42
43
	/**
44
	 * @param string $string
45
	 * @return string
46
	 */
47 4
	public function camelCase( $string )
48
	{
49 4
		$string = ucwords( str_replace( ['-', '_'], ' ', trim( $string )));
50 4
		return str_replace( ' ', '', $string );
51
	}
52
53
	/**
54
	 * @return bool
55
	 */
56 1
	public function compareArrays( array $arr1, array $arr2 )
57
	{
58 1
		sort( $arr1 );
59 1
		sort( $arr2 );
60 1
		return $arr1 == $arr2;
61
	}
62
63
	/**
64
	 * @param mixed $array
65
	 * @return array
66
	 */
67
	public function consolidateArray( $array )
68
	{
69
		return is_array( $array )
70
			? $array
71
			: [];
72
	}
73
74
	/**
75
	 * @return array
76
	 */
77 8
	public function convertDotNotationArray( array $array )
78
	{
79 8
		$results = [];
80 8
		foreach( $array as $path => $value ) {
81 8
			$results = $this->setPathValue( $path, $value, $results );
82
		}
83 8
		return $results;
84
	}
85
86
	/**
87
	 * @param string $name
88
	 * @return string
89
	 */
90 1
	public function convertPathToId( $path, $prefix = '' )
91
	{
92 1
		return str_replace( ['[', ']'], ['-', ''], $this->convertPathToName( $path, $prefix ));
93
	}
94
95
	/**
96
	 * @param string $path
97
	 * @return string
98
	 */
99 2
	public function convertPathToName( $path, $prefix = '' )
100
	{
101 2
		$levels = explode( '.', $path );
102 2
		return array_reduce( $levels, function( $result, $value ) {
103 2
			return $result.= '['.$value.']';
104 2
		}, $prefix );
105
	}
106
107
	/**
108
	 * @param string $string
109
	 * @param mixed $callback
110
	 * @return array
111
	 */
112 1
	public function convertStringToArray( $string, $callback = null )
113
	{
114 1
		$array = array_map( 'trim', explode( ',', $string ));
115 1
		return $callback
116
			? array_filter( $array, $callback )
117 1
			: array_filter( $array );
118
	}
119
120
	/**
121
	 * @param string $string
122
	 * @return string
123
	 */
124 8
	public function dashCase( $string )
125
	{
126 8
		return str_replace( '_', '-', $this->snakeCase( $string ));
127
	}
128
129
	/**
130
	 * @param string $needle
131
	 * @param string $haystack
132
	 * @return bool
133
	 */
134 1
	public function endsWith( $needle, $haystack )
135
	{
136 1
		$length = strlen( $needle );
137 1
		return $length != 0
138 1
			? substr( $haystack, -$length ) === $needle
139 1
			: true;
140
	}
141
142
	/**
143
	 * @param string $key
144
	 * @return mixed
145
	 */
146 2
	public function filterInput( $key, array $request = [] )
147
	{
148 2
		if( isset( $request[$key] )) {
149 1
			return $request[$key];
150
		}
151 2
		$variable = filter_input( INPUT_POST, $key );
152 2
		if( is_null( $variable ) && isset( $_POST[$key] )) {
153 2
			$variable = $_POST[$key];
154
		}
155 2
		return $variable;
156
	}
157
158
	/**
159
	 * @param string $key
160
	 * @return array
161
	 */
162 2
	public function filterInputArray( $key )
163
	{
164 2
		$variable = filter_input( INPUT_POST, $key, FILTER_DEFAULT, FILTER_REQUIRE_ARRAY );
165 2
		if( empty( $variable ) && !empty( $_POST[$key] ) && is_array( $_POST[$key] )) {
166 2
			$variable = $_POST[$key];
167
		}
168 2
		return (array)$variable;
169
	}
170
171
	/**
172
	 * @param bool $flattenValue
173
	 * @param string $prefix
174
	 * @return array
175
	 */
176 7
	public function flattenArray( array $array, $flattenValue = false, $prefix = '' )
177
	{
178 7
		$result = [];
179 7
		foreach( $array as $key => $value ) {
180 7
			$newKey = ltrim( $prefix.'.'.$key, '.' );
181 7
			if( $this->isIndexedFlatArray( $value )) {
182 7
				if( $flattenValue ) {
183 7
					$value = '['.implode( ', ', $value ).']';
184
				}
185
			}
186 7
			else if( is_array( $value )) {
187 7
				$result = array_merge( $result, $this->flattenArray( $value, $flattenValue, $newKey ));
188 7
				continue;
189
			}
190 7
			$result[$newKey] = $value;
191
		}
192 7
		return $result;
193
	}
194
195
	/**
196
	 * @return string
197
	 */
198 1
	public function getIpAddress()
199
	{
200 1
		$cloudflareIps = glsr( Cache::class )->getCloudflareIps();
201 1
		$ipv6 = defined( 'AF_INET6' )
202 1
			? $cloudflareIps['v6']
203 1
			: [];
204 1
		return (string)(new Whip( Whip::CLOUDFLARE_HEADERS | Whip::REMOTE_ADDR, [
205 1
			Whip::CLOUDFLARE_HEADERS => [
206 1
				Whip::IPV4 => $cloudflareIps['v4'],
207 1
				Whip::IPV6 => $ipv6,
208
			],
209 1
		]))->getValidIpAddress();
210
	}
211
212
	/**
213
	 * Get a value from an array of values using a dot-notation path as reference
214
	 * @param string $path
215
	 * @param mixed $fallback
216
	 * @return void|mixed
217
	 */
218 8
	public function getPathValue( $path = '', array $values, $fallback = '' )
219
	{
220 8
		$keys = explode( '.', $path );
221 8
		foreach( $keys as $key ) {
222 8
			if( !isset( $values[$key] )) {
223 3
				return $fallback;
224
			}
225 8
			$values = $values[$key];
226
		}
227 8
		return $values;
228
	}
229
230
	/**
231
	 * @param string $key
232
	 * @param string $position
233
	 * @return array
234
	 */
235
	public function insertInArray( array $array, array $insert, $key, $position = 'before' )
236
	{
237
		$keyPosition = intval( array_search( $key, array_keys( $array )));
238
		if( 'after' == $position ) {
239
			$keyPosition++;
240
		}
241
		if( false !== $keyPosition ) {
242
			$result = array_slice( $array, 0, $keyPosition );
243
			$result = array_merge( $result, $insert );
244
			return array_merge( $result, array_slice( $array, $keyPosition ));
245
		}
246
		return array_merge( $array, $insert );
247
	}
248
249
	/**
250
	 * @param mixed $array
251
	 * @return bool
252
	 */
253 9
	public function isIndexedArray( $array )
254
	{
255 9
		if( !is_array( $array )) {
256 1
			return false;
257
		}
258 9
		$current = 0;
259 9
		foreach( array_keys( $array ) as $key ) {
260 9
			if( $key !== $current ) {
261 7
				return false;
262
			}
263 9
			$current++;
264
		}
265 9
		return true;
266
	}
267
268
	/**
269
	 * @param mixed $array
270
	 * @return bool
271
	 */
272 8
	public function isIndexedFlatArray( $array )
273
	{
274 8
		if( !is_array( $array ) || array_filter( $array, 'is_array' )) {
275 8
			return false;
276
		}
277 8
		return $this->isIndexedArray( $array );
278
	}
279
280
	/**
281
	 * @param string $string
282
	 * @param string $prefix
283
	 * @return string
284
	 */
285 1
	public function prefixString( $string, $prefix = '' )
286
	{
287 1
		return $prefix.str_replace( $prefix, '', trim( $string ));
288
	}
289
290
	/**
291
	 * @return array
292
	 */
293 8
	public function removeEmptyArrayValues( array $array )
294
	{
295 8
		$result = [];
296 8
		foreach( $array as $key => $value ) {
297 8
			if( !$value )continue;
298 8
			$result[$key] = is_array( $value )
299 7
				? $this->removeEmptyArrayValues( $value )
300 8
				: $value;
301
		}
302 8
		return $result;
303
	}
304
305
	/**
306
	 * @param string $prefix
307
	 * @param string $text
308
	 * @return string
309
	 */
310 7
	public function removePrefix( $prefix, $text )
311
	{
312 7
		return 0 === strpos( $text, $prefix )
313 7
			? substr( $text, strlen( $prefix ))
314 7
			: $text;
315
	}
316
317
	/**
318
	 * Set a value to an array of values using a dot-notation path as reference
319
	 * @param string $path
320
	 * @param mixed $value
321
	 * @return array
322
	 */
323 9
	public function setPathValue( $path, $value, array $values )
324
	{
325 9
		$token = strtok( $path, '.' );
326 9
		$ref = &$values;
327 9
		while( $token !== false ) {
328 9
			$ref = is_array( $ref )
329 9
				? $ref
330 9
				: [];
331 9
			$ref = &$ref[$token];
332 9
			$token = strtok( '.' );
333
		}
334 9
		$ref = $value;
335 9
		return $values;
336
	}
337
338
	/**
339
	 * @param string $string
340
	 * @return string
341
	 */
342 9
	public function snakeCase( $string )
343
	{
344 9
		if( !ctype_lower( $string )) {
345 9
			$string = preg_replace( '/\s+/u', '', $string );
346 9
			$string = preg_replace( '/(.)(?=[A-Z])/u', '$1_', $string );
347 9
			$string = function_exists( 'mb_strtolower' )
348 9
				? mb_strtolower( $string, 'UTF-8' )
349 9
				: strtolower( $string );
350
		}
351 9
		return str_replace( '-', '_', $string );
352
	}
353
354
	/**
355
	 * @param string $needle
356
	 * @param string $haystack
357
	 * @return bool
358
	 */
359 8
	public function startsWith( $needle, $haystack )
360
	{
361 8
		return substr( $haystack, 0, strlen( $needle )) === $needle;
362
	}
363
}
364