supernova-ws /
SuperNova
| 1 | <?php |
||||||
| 2 | |||||||
| 3 | class HelperArray { |
||||||
| 4 | |||||||
| 5 | /** |
||||||
| 6 | * Overwrites old array with new |
||||||
| 7 | */ |
||||||
| 8 | const MERGE_OVERWRITE = 0; |
||||||
| 9 | /** |
||||||
| 10 | * Merges old array with new with array_merge() |
||||||
| 11 | * String keys replaced, numeric keys renumbered |
||||||
| 12 | */ |
||||||
| 13 | const MERGE_PHP = 1; |
||||||
| 14 | |||||||
| 15 | /** |
||||||
| 16 | * Merges old array with new with array_merge_recursive() |
||||||
| 17 | * String keys replaced, numeric keys renumbered |
||||||
| 18 | */ |
||||||
| 19 | const MERGE_RECURSIVE = 2; |
||||||
| 20 | |||||||
| 21 | /** |
||||||
| 22 | * Merges old array with new recursive |
||||||
| 23 | * String keys merged, numeric keys merged |
||||||
| 24 | */ |
||||||
| 25 | const MERGE_RECURSIVE_NUMERIC = 3; |
||||||
| 26 | |||||||
| 27 | |||||||
| 28 | /** |
||||||
| 29 | * No array cloning - just stay with same objects |
||||||
| 30 | */ |
||||||
| 31 | const CLONE_ARRAY_NONE = 0; |
||||||
| 32 | /** |
||||||
| 33 | * Clone objects on first level of array |
||||||
| 34 | */ |
||||||
| 35 | const CLONE_ARRAY_SHALLOW = 1; |
||||||
| 36 | /** |
||||||
| 37 | * Clone objects recursive on any array level |
||||||
| 38 | */ |
||||||
| 39 | const CLONE_ARRAY_RECURSIVE = 2; |
||||||
| 40 | |||||||
| 41 | /** |
||||||
| 42 | * Convert $delimiter delimited string to array |
||||||
| 43 | * |
||||||
| 44 | * @param mixed $string |
||||||
| 45 | * @param string $delimiter |
||||||
| 46 | * |
||||||
| 47 | * @return array |
||||||
| 48 | */ |
||||||
| 49 | 6 | public static function stringToArray($string, $delimiter = ',') { |
|||||
| 50 | 6 | return is_string($string) && !empty($string) ? explode($delimiter, $string) : array(); |
|||||
| 51 | } |
||||||
| 52 | |||||||
| 53 | /** |
||||||
| 54 | * Convert single value to array by reference |
||||||
| 55 | * |
||||||
| 56 | * @param mixed &$value |
||||||
| 57 | */ |
||||||
| 58 | 3 | public static function makeArrayRef(&$value, $index = 0) { |
|||||
| 59 | 3 | if (!is_array($value)) { |
|||||
| 60 | 2 | $value = array($index => $value); |
|||||
| 61 | 2 | } |
|||||
| 62 | 3 | } |
|||||
| 63 | |||||||
| 64 | |||||||
| 65 | /** |
||||||
| 66 | * Convert single value to array |
||||||
| 67 | * |
||||||
| 68 | * @param mixed $value |
||||||
| 69 | * |
||||||
| 70 | * @return array |
||||||
| 71 | */ |
||||||
| 72 | 3 | public static function makeArray($value, $index = 0) { |
|||||
| 73 | 3 | static::makeArrayRef($value, $index); |
|||||
| 74 | |||||||
| 75 | 3 | return $value; |
|||||
| 76 | } |
||||||
| 77 | |||||||
| 78 | /** |
||||||
| 79 | * Filters array by callback |
||||||
| 80 | * |
||||||
| 81 | * @param mixed $array |
||||||
| 82 | * @param callable $callback |
||||||
| 83 | * |
||||||
| 84 | * @return array |
||||||
| 85 | */ |
||||||
| 86 | 15 | public static function filter(&$array, $callback) { |
|||||
| 87 | 15 | $result = array(); |
|||||
| 88 | |||||||
| 89 | 15 | if (is_array($array) && !empty($array)) { |
|||||
| 90 | // TODO - array_filter |
||||||
| 91 | 10 | foreach ($array as $value) { |
|||||
| 92 | 10 | if (call_user_func($callback, $value)) { |
|||||
| 93 | 6 | $result[] = $value; |
|||||
| 94 | 6 | } |
|||||
| 95 | 10 | } |
|||||
| 96 | 10 | } |
|||||
| 97 | |||||||
| 98 | 15 | return $result; |
|||||
| 99 | } |
||||||
| 100 | |||||||
| 101 | /** |
||||||
| 102 | * Filters array by callback |
||||||
| 103 | * |
||||||
| 104 | * @param mixed $array |
||||||
| 105 | * @param callable $callback |
||||||
| 106 | * @param bool $withKeys |
||||||
| 107 | * |
||||||
| 108 | * @return array |
||||||
| 109 | */ |
||||||
| 110 | public static function map(&$array, $callback, $withKeys = false) { |
||||||
| 111 | $result = array(); |
||||||
| 112 | |||||||
| 113 | if (is_array($array) && !empty($array)) { |
||||||
| 114 | if ($withKeys) { |
||||||
| 115 | $result = array_map($callback, $array, array_keys($array)); |
||||||
| 116 | } else { |
||||||
| 117 | $result = array_map($callback, $array); |
||||||
| 118 | } |
||||||
| 119 | } |
||||||
| 120 | |||||||
| 121 | return $result; |
||||||
| 122 | } |
||||||
| 123 | |||||||
| 124 | /** |
||||||
| 125 | * Filter empty() values from array |
||||||
| 126 | * |
||||||
| 127 | * @param $array |
||||||
| 128 | * |
||||||
| 129 | * @return array |
||||||
| 130 | */ |
||||||
| 131 | 8 | public static function filterEmpty($array) { |
|||||
| 132 | 8 | return static::filter($array, 'Validators::isNotEmpty'); |
|||||
| 133 | } |
||||||
| 134 | |||||||
| 135 | /** |
||||||
| 136 | * @param string $string |
||||||
| 137 | * @param string $delimiter |
||||||
| 138 | * |
||||||
| 139 | * @return array |
||||||
| 140 | */ |
||||||
| 141 | 1 | public static function stringToArrayFilterEmpty($string, $delimiter = ',') { |
|||||
| 142 | 1 | return static::filterEmpty(static::stringToArray($string, $delimiter)); |
|||||
| 143 | } |
||||||
| 144 | |||||||
| 145 | /** |
||||||
| 146 | * @param mixed|array &$arrayOld |
||||||
| 147 | * @param mixed|array $arrayNew |
||||||
| 148 | * @param int $mergeStrategy - default is HelperArray::MERGE_OVERWRITE |
||||||
| 149 | */ |
||||||
| 150 | 1 | public static function merge(&$arrayOld, $arrayNew = array(), $mergeStrategy = self::MERGE_OVERWRITE) { |
|||||
| 151 | 1 | static::makeArrayRef($arrayNew); |
|||||
| 152 | 1 | static::makeArrayRef($arrayOld); |
|||||
| 153 | |||||||
| 154 | switch ($mergeStrategy) { |
||||||
| 155 | 1 | case self::MERGE_PHP: |
|||||
| 156 | 1 | $arrayOld = array_merge($arrayOld, $arrayNew); |
|||||
| 157 | 1 | break; |
|||||
| 158 | |||||||
| 159 | 1 | case self::MERGE_RECURSIVE: |
|||||
| 160 | $arrayOld = array_merge_recursive($arrayOld, $arrayNew); |
||||||
| 161 | break; |
||||||
| 162 | |||||||
| 163 | 1 | case self::MERGE_RECURSIVE_NUMERIC: |
|||||
| 164 | foreach ($arrayNew as $key => $value) { |
||||||
| 165 | !isset($arrayOld[$key]) || !is_array($arrayOld[$key]) ? $arrayOld[$key] = $value : self::merge($arrayOld[$key], $value, self::MERGE_RECURSIVE_NUMERIC); |
||||||
| 166 | } |
||||||
| 167 | break; |
||||||
| 168 | |||||||
| 169 | 1 | default: |
|||||
| 170 | 1 | $arrayOld = $arrayNew; |
|||||
| 171 | 1 | break; |
|||||
| 172 | 1 | } |
|||||
| 173 | 1 | } |
|||||
| 174 | |||||||
| 175 | /** |
||||||
| 176 | * Checks if key exists in array. If yes - return value on key otherwise return default value |
||||||
| 177 | * |
||||||
| 178 | * @param array &$array |
||||||
| 179 | * @param mixed $key |
||||||
| 180 | * @param mixed $default |
||||||
| 181 | * |
||||||
| 182 | * @return mixed |
||||||
| 183 | */ |
||||||
| 184 | 1 | public static function keyExistsOr(&$array, $key, $default) { |
|||||
| 185 | 1 | return array_key_exists($key, $array) ? $array[$key] : $default; |
|||||
| 186 | } |
||||||
| 187 | |||||||
| 188 | /** |
||||||
| 189 | * Clone objects in array |
||||||
| 190 | * |
||||||
| 191 | * @param array &$array - Any dimensional array with presumed objects in there |
||||||
| 192 | * @param int $deep - HelperArray::CLONE_ARRAY_xxx constants |
||||||
| 193 | */ |
||||||
| 194 | 3 | public static function cloneDeep(&$array, $deep = self::CLONE_ARRAY_RECURSIVE) { |
|||||
| 195 | 3 | if ($deep == self::CLONE_ARRAY_NONE) { |
|||||
| 196 | 1 | return; |
|||||
| 197 | } |
||||||
| 198 | |||||||
| 199 | 2 | foreach ($array as &$value) { |
|||||
| 200 | 2 | if (is_object($value)) { |
|||||
| 201 | 2 | $value = clone $value; |
|||||
| 202 | 2 | } elseif (is_array($value) && $deep == self::CLONE_ARRAY_RECURSIVE) { |
|||||
| 203 | 1 | static::cloneDeep($value, $deep); |
|||||
| 204 | 1 | } |
|||||
| 205 | 2 | } |
|||||
| 206 | 2 | } |
|||||
| 207 | |||||||
| 208 | /** |
||||||
| 209 | * Repacking array to provided level, removing null elements |
||||||
| 210 | * |
||||||
| 211 | * @param array &$array |
||||||
| 212 | * @param int $level |
||||||
| 213 | */ |
||||||
| 214 | public static function array_repack(&$array, $level = 0) { |
||||||
| 215 | if (!is_array($array)) { |
||||||
|
0 ignored issues
–
show
introduced
by
Loading history...
|
|||||||
| 216 | return; |
||||||
| 217 | } |
||||||
| 218 | |||||||
| 219 | foreach ($array as $key => &$value) { |
||||||
| 220 | if ($value === null) { |
||||||
| 221 | unset($array[$key]); |
||||||
| 222 | } elseif ($level > 0 && is_array($value)) { |
||||||
| 223 | static::array_repack($value, $level - 1); |
||||||
| 224 | if (empty($value)) { |
||||||
| 225 | unset($array[$key]); |
||||||
| 226 | } |
||||||
| 227 | } |
||||||
| 228 | } |
||||||
| 229 | } |
||||||
| 230 | |||||||
| 231 | |||||||
| 232 | /** |
||||||
| 233 | * Parses array of stringified parameters to array of parameter |
||||||
| 234 | * |
||||||
| 235 | * Stringified parameter is a string of "<parmName><delimeter><paramValue>" |
||||||
| 236 | * |
||||||
| 237 | * @param array|string $array |
||||||
| 238 | * @param string $delimiter |
||||||
| 239 | * |
||||||
| 240 | * @return array |
||||||
| 241 | */ |
||||||
| 242 | public static function parseParamStrings($array, $delimiter = '=') { |
||||||
| 243 | !is_array($array) ? $array = array((string)$array) : false; |
||||||
| 244 | |||||||
| 245 | $result = array(); |
||||||
| 246 | foreach ($array as $param) { |
||||||
| 247 | $exploded = explode($delimiter, $param); |
||||||
| 248 | $paramName = $exploded[0]; |
||||||
| 249 | unset($exploded[0]); |
||||||
| 250 | $result[$paramName] = implode($delimiter, $exploded); |
||||||
| 251 | } |
||||||
| 252 | |||||||
| 253 | return $result; |
||||||
| 254 | } |
||||||
| 255 | |||||||
| 256 | /** |
||||||
| 257 | * Finds maximum value of field in subarrays |
||||||
| 258 | * |
||||||
| 259 | * @param array[] $array |
||||||
| 260 | * @param mixed $fieldName |
||||||
| 261 | * |
||||||
| 262 | * @return float|null |
||||||
| 263 | */ |
||||||
| 264 | public static function maxValueByField(&$array, $fieldName) { |
||||||
| 265 | return array_reduce($array, function ($carry, $item) use ($fieldName) { |
||||||
| 266 | if(is_array($item) && isset($item[$fieldName]) && (!isset($carry) || $carry < $item[$fieldName])) { |
||||||
| 267 | $carry = $item[$fieldName]; |
||||||
| 268 | } |
||||||
| 269 | |||||||
| 270 | return $carry; |
||||||
| 271 | }); |
||||||
| 272 | } |
||||||
| 273 | |||||||
| 274 | /** |
||||||
| 275 | * @param $array |
||||||
| 276 | * @param $fieldName |
||||||
| 277 | */ |
||||||
| 278 | public static function topRecordsByField(&$array, $fieldName) { |
||||||
| 279 | $maxValue = self::maxValueByField($array, $fieldName); |
||||||
| 280 | |||||||
| 281 | return |
||||||
| 282 | array_reduce($array, |
||||||
| 283 | function ($carry, $item) use (&$fieldName, $maxValue) { |
||||||
| 284 | if(is_array($item) && isset($item[$fieldName]) && $item[$fieldName] == $maxValue) { |
||||||
| 285 | $carry[] = $item; |
||||||
| 286 | } |
||||||
| 287 | |||||||
| 288 | return $carry; |
||||||
| 289 | }, |
||||||
| 290 | array() |
||||||
| 291 | ); |
||||||
| 292 | } |
||||||
| 293 | |||||||
| 294 | public static function intersectByKeys(array &$array1, array &$array2) { |
||||||
| 295 | return array_uintersect_assoc($array1, $array2, function ($a, $b) {return 0;}); |
||||||
|
0 ignored issues
–
show
The parameter
$a is not used and could be removed.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check looks for parameters that have been defined for a function or method, but which are not used in the method body. Loading history...
The parameter
$b is not used and could be removed.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check looks for parameters that have been defined for a function or method, but which are not used in the method body. Loading history...
|
|||||||
| 296 | } |
||||||
| 297 | |||||||
| 298 | /** |
||||||
| 299 | * Get first key of array |
||||||
| 300 | * Polyfill until PHP 7.3 |
||||||
| 301 | * |
||||||
| 302 | * @param array $array |
||||||
| 303 | * |
||||||
| 304 | * @return mixed|null |
||||||
| 305 | */ |
||||||
| 306 | public static function array_key_first(&$array) { |
||||||
| 307 | if (!is_array($array)) { |
||||||
|
0 ignored issues
–
show
|
|||||||
| 308 | return null; |
||||||
| 309 | } |
||||||
| 310 | reset($array); |
||||||
| 311 | |||||||
| 312 | return key($array); |
||||||
| 313 | } |
||||||
| 314 | |||||||
| 315 | } |
||||||
| 316 |