Passed
Push — master ( ad7989...648c0b )
by Paul
09:21 queued 04:46
created

Helper::insertInArray()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 12
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

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