|
12 | 12 | use ArrayAccess;
|
13 | 13 | use ArrayObject;
|
14 | 14 | use stdClass;
|
15 |
| -use Toolkit\Stdlib\Php; |
16 | 15 | use Traversable;
|
17 | 16 | use function array_change_key_case;
|
18 | 17 | use function array_diff;
|
|
32 | 31 | use function gettype;
|
33 | 32 | use function in_array;
|
34 | 33 | use function is_array;
|
35 |
| -use function is_int; |
36 | 34 | use function is_numeric;
|
37 | 35 | use function is_object;
|
38 | 36 | use function is_resource;
|
|
52 | 50 | */
|
53 | 51 | class ArrayHelper
|
54 | 52 | {
|
| 53 | + use Traits\ArrayMergeTrait; |
| 54 | + use Traits\ArrayValueGetSetTrait; |
| 55 | + |
55 | 56 | /**
|
56 | 57 | * Determine whether the given value is array accessible.
|
57 | 58 | *
|
@@ -118,126 +119,6 @@ public static function toObject($array, $class = stdClass::class)
|
118 | 119 | return $object;
|
119 | 120 | }
|
120 | 121 |
|
121 |
| - /** |
122 |
| - * Get Multi - 获取多个, 可以设置默认值 |
123 |
| - * |
124 |
| - * @param array $data array data |
125 |
| - * @param array $needKeys |
126 |
| - * $needKeys = [ |
127 |
| - * 'name', |
128 |
| - * 'password', |
129 |
| - * 'status' => '1' |
130 |
| - * ] |
131 |
| - * @param bool|false $unsetKey |
132 |
| - * |
133 |
| - * @return array |
134 |
| - */ |
135 |
| - public static function gets(array &$data, array $needKeys = [], $unsetKey = false): array |
136 |
| - { |
137 |
| - $needed = []; |
138 |
| - |
139 |
| - foreach ($needKeys as $key => $default) { |
140 |
| - if (is_int($key)) { |
141 |
| - $key = $default; |
142 |
| - $default = null; |
143 |
| - } |
144 |
| - |
145 |
| - if (isset($data[$key])) { |
146 |
| - $value = $data[$key]; |
147 |
| - |
148 |
| - if (is_int($default)) { |
149 |
| - $value = (int)$value; |
150 |
| - } elseif (is_string($default)) { |
151 |
| - $value = trim($value); |
152 |
| - } elseif (is_array($default)) { |
153 |
| - $value = (array)$value; |
154 |
| - } |
155 |
| - |
156 |
| - $needed[$key] = $value; |
157 |
| - |
158 |
| - if ($unsetKey) { |
159 |
| - unset($data[$key]); |
160 |
| - } |
161 |
| - } else { |
162 |
| - $needed[$key] = $default; |
163 |
| - } |
164 |
| - } |
165 |
| - |
166 |
| - return $needed; |
167 |
| - } |
168 |
| - |
169 |
| - /** |
170 |
| - * 递归合并两个多维数组,后面的值将会递归覆盖原来的值 |
171 |
| - * |
172 |
| - * @param array|null $src |
173 |
| - * @param array $new |
174 |
| - * |
175 |
| - * @return array |
176 |
| - */ |
177 |
| - public static function merge($src, array $new): array |
178 |
| - { |
179 |
| - if (!$src || !is_array($src)) { |
180 |
| - return $new; |
181 |
| - } |
182 |
| - |
183 |
| - if (!$new) { |
184 |
| - return $src; |
185 |
| - } |
186 |
| - |
187 |
| - foreach ($new as $key => $value) { |
188 |
| - if (is_int($key)) { |
189 |
| - if (isset($src[$key])) { |
190 |
| - $src[] = $value; |
191 |
| - } else { |
192 |
| - $src[$key] = $value; |
193 |
| - } |
194 |
| - } elseif (array_key_exists($key, $src) && is_array($value)) { |
195 |
| - $src[$key] = self::merge($src[$key], $new[$key]); |
196 |
| - } else { |
197 |
| - $src[$key] = $value; |
198 |
| - } |
199 |
| - } |
200 |
| - |
201 |
| - return $src; |
202 |
| - } |
203 |
| - |
204 |
| - /** |
205 |
| - * 递归合并多个多维数组, |
206 |
| - * |
207 |
| - * @from yii2 |
208 |
| - * Merges two or more arrays into one recursively. |
209 |
| - * |
210 |
| - * @param array $args |
211 |
| - * |
212 |
| - * @return array the merged array (the original arrays are not changed.) |
213 |
| - */ |
214 |
| - public static function merge2(...$args): array |
215 |
| - { |
216 |
| - /** @var array[] $args */ |
217 |
| - $res = array_shift($args); |
218 |
| - |
219 |
| - while (!empty($args)) { |
220 |
| - /** @var array $next */ |
221 |
| - $next = array_shift($args); |
222 |
| - |
223 |
| - foreach ($next as $k => $v) { |
224 |
| - if (is_int($k)) { |
225 |
| - if (isset($res[$k])) { |
226 |
| - $res[] = $v; |
227 |
| - } else { |
228 |
| - $res[$k] = $v; |
229 |
| - } |
230 |
| - } elseif (is_array($v) && isset($res[$k]) && is_array($res[$k])) { |
231 |
| - $res[$k] = self::merge2($res[$k], $v); |
232 |
| - } else { |
233 |
| - $res[$k] = $v; |
234 |
| - } |
235 |
| - } |
236 |
| - } |
237 |
| - |
238 |
| - return $res; |
239 |
| - } |
240 |
| - |
241 | 122 | /**
|
242 | 123 | * 清理数组值的空白
|
243 | 124 | *
|
@@ -452,108 +333,6 @@ public static function getKeyMaxWidth(array $data, $expectInt = true): int
|
452 | 333 | return $keyMaxWidth;
|
453 | 334 | }
|
454 | 335 |
|
455 |
| - /** |
456 |
| - * Get data from array or object by path. |
457 |
| - * Example: `DataCollector::getByPath($array, 'foo.bar.yoo')` equals to $array['foo']['bar']['yoo']. |
458 |
| - * |
459 |
| - * @param array|ArrayAccess $data An array or object to get value. |
460 |
| - * @param mixed $path The key path. |
461 |
| - * @param mixed $default |
462 |
| - * @param string $separator Separator of paths. |
463 |
| - * |
464 |
| - * @return mixed Found value, null if not exists. |
465 |
| - */ |
466 |
| - public static function getByPath($data, string $path, $default = null, string $separator = '.') |
467 |
| - { |
468 |
| - if (isset($data[$path])) { |
469 |
| - return $data[$path]; |
470 |
| - } |
471 |
| - |
472 |
| - // Error: will clear '0'. eg 'some-key.0' |
473 |
| - // if (!$nodes = array_filter(explode($separator, $path))) { |
474 |
| - if (!$nodes = explode($separator, $path)) { |
475 |
| - return $default; |
476 |
| - } |
477 |
| - |
478 |
| - $dataTmp = $data; |
479 |
| - |
480 |
| - foreach ($nodes as $arg) { |
481 |
| - if (is_object($dataTmp) && isset($dataTmp->$arg)) { |
482 |
| - $dataTmp = $dataTmp->$arg; |
483 |
| - } elseif ((is_array($dataTmp) || $dataTmp instanceof ArrayAccess) && isset($dataTmp[$arg])) { |
484 |
| - $dataTmp = $dataTmp[$arg]; |
485 |
| - } else { |
486 |
| - return $default; |
487 |
| - } |
488 |
| - } |
489 |
| - |
490 |
| - return $dataTmp; |
491 |
| - } |
492 |
| - |
493 |
| - /** |
494 |
| - * findValueByNodes |
495 |
| - * |
496 |
| - * @param array $data |
497 |
| - * @param array $nodes |
498 |
| - * @param mixed $default |
499 |
| - * |
500 |
| - * @return mixed |
501 |
| - */ |
502 |
| - public static function getValueByNodes(array $data, array $nodes, $default = null) |
503 |
| - { |
504 |
| - $temp = $data; |
505 |
| - |
506 |
| - foreach ($nodes as $name) { |
507 |
| - if (isset($temp[$name])) { |
508 |
| - $temp = $temp[$name]; |
509 |
| - } else { |
510 |
| - $temp = $default; |
511 |
| - break; |
512 |
| - } |
513 |
| - } |
514 |
| - |
515 |
| - return $temp; |
516 |
| - } |
517 |
| - |
518 |
| - /** |
519 |
| - * setByPath |
520 |
| - * |
521 |
| - * @param array|ArrayAccess &$data |
522 |
| - * @param string $path |
523 |
| - * @param mixed $value |
524 |
| - * @param string $separator |
525 |
| - */ |
526 |
| - public static function setByPath(&$data, string $path, $value, string $separator = '.'): void |
527 |
| - { |
528 |
| - if (false === strpos($path, $separator)) { |
529 |
| - $data[$path] = $value; |
530 |
| - return; |
531 |
| - } |
532 |
| - |
533 |
| - if (!$nodes = array_filter(explode($separator, $path))) { |
534 |
| - return; |
535 |
| - } |
536 |
| - |
537 |
| - $dataTmp = &$data; |
538 |
| - |
539 |
| - foreach ($nodes as $node) { |
540 |
| - if (is_array($dataTmp)) { |
541 |
| - if (empty($dataTmp[$node])) { |
542 |
| - $dataTmp[$node] = []; |
543 |
| - } |
544 |
| - |
545 |
| - $dataTmp = &$dataTmp[$node]; |
546 |
| - } else { |
547 |
| - // If a node is value but path is not go to the end, we replace this value as a new store. |
548 |
| - // Then next node can insert new value to this store. |
549 |
| - $dataTmp = []; |
550 |
| - } |
551 |
| - } |
552 |
| - |
553 |
| - // Now, path go to the end, means we get latest node, set value to this node. |
554 |
| - $dataTmp = $value; |
555 |
| - } |
556 |
| - |
557 | 336 | ////////////////////////////////////////////////////////////
|
558 | 337 | /// from laravel
|
559 | 338 | ////////////////////////////////////////////////////////////
|
@@ -669,93 +448,6 @@ public static function exists(array $array, $key): bool
|
669 | 448 | return array_key_exists($key, $array);
|
670 | 449 | }
|
671 | 450 |
|
672 |
| - /** |
673 |
| - * Add an element to an array using "dot" notation if it doesn't exist. |
674 |
| - * |
675 |
| - * @param array $array |
676 |
| - * @param string $key |
677 |
| - * @param mixed $value |
678 |
| - * |
679 |
| - * @return array |
680 |
| - */ |
681 |
| - public static function add(array $array, $key, $value): array |
682 |
| - { |
683 |
| - if (static::has($array, $key)) { |
684 |
| - static::set($array, $key, $value); |
685 |
| - } |
686 |
| - |
687 |
| - return $array; |
688 |
| - } |
689 |
| - |
690 |
| - /** |
691 |
| - * Get an item from an array using "dot" notation. |
692 |
| - * |
693 |
| - * @param ArrayAccess|array $array |
694 |
| - * @param string $key |
695 |
| - * @param mixed $default |
696 |
| - * |
697 |
| - * @return mixed |
698 |
| - */ |
699 |
| - public static function get($array, $key, $default = null) |
700 |
| - { |
701 |
| - if (!static::accessible($array)) { |
702 |
| - return Php::value($default); |
703 |
| - } |
704 |
| - |
705 |
| - if (null === $key) { |
706 |
| - return $array; |
707 |
| - } |
708 |
| - |
709 |
| - if (static::exists($array, $key)) { |
710 |
| - return $array[$key]; |
711 |
| - } |
712 |
| - |
713 |
| - foreach (explode('.', $key) as $segment) { |
714 |
| - if (static::accessible($array) && static::exists($array, $segment)) { |
715 |
| - $array = $array[$segment]; |
716 |
| - } else { |
717 |
| - return Php::value($default); |
718 |
| - } |
719 |
| - } |
720 |
| - |
721 |
| - return $array; |
722 |
| - } |
723 |
| - |
724 |
| - /** |
725 |
| - * Set an array item to a given value using "dot" notation. |
726 |
| - * If no key is given to the method, the entire array will be replaced. |
727 |
| - * |
728 |
| - * @param array $array |
729 |
| - * @param string $key |
730 |
| - * @param mixed $value |
731 |
| - * |
732 |
| - * @return array |
733 |
| - */ |
734 |
| - public static function set(array &$array, $key, $value): array |
735 |
| - { |
736 |
| - if (null === $key) { |
737 |
| - return ($array = $value); |
738 |
| - } |
739 |
| - |
740 |
| - $keys = explode('.', $key); |
741 |
| - |
742 |
| - while (count($keys) > 1) { |
743 |
| - $key = array_shift($keys); |
744 |
| - // If the key doesn't exist at this depth, we will just create an empty array |
745 |
| - // to hold the next value, allowing us to create the arrays to hold final |
746 |
| - // values at the correct depth. Then we'll keep digging into the array. |
747 |
| - if (!isset($array[$key]) || !is_array($array[$key])) { |
748 |
| - $array[$key] = []; |
749 |
| - } |
750 |
| - |
751 |
| - $array = &$array[$key]; |
752 |
| - } |
753 |
| - |
754 |
| - $array[array_shift($keys)] = $value; |
755 |
| - |
756 |
| - return $array; |
757 |
| - } |
758 |
| - |
759 | 451 | /**
|
760 | 452 | * Flatten a multi-dimensional array into a single level.
|
761 | 453 | *
|
@@ -1026,14 +718,14 @@ public static function toString(
|
1026 | 718 |
|
1027 | 719 | if (is_array($value)) {
|
1028 | 720 | $string .= $keyStr . 'Array(' . self::toString(
|
1029 |
| - $value, |
1030 |
| - $length, |
1031 |
| - $cycles, |
1032 |
| - $showKey, |
1033 |
| - $addMark, |
1034 |
| - $separator, |
1035 |
| - $string |
1036 |
| - ) . ')' . $separator; |
| 721 | + $value, |
| 722 | + $length, |
| 723 | + $cycles, |
| 724 | + $showKey, |
| 725 | + $addMark, |
| 726 | + $separator, |
| 727 | + $string |
| 728 | + ) . ')' . $separator; |
1037 | 729 | } elseif (is_object($value)) {
|
1038 | 730 | $string .= $keyStr . 'Object(' . get_class($value) . ')' . $separator;
|
1039 | 731 | } elseif (is_resource($value)) {
|
|
0 commit comments