1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10:
11:
12: namespace Nette;
13:
14: use Nette;
15:
16:
17:
18: 19: 20: 21: 22:
23: final class ArrayTools
24: {
25:
26: 27: 28:
29: final public function __construct()
30: {
31: throw new \LogicException("Cannot instantiate static class " . get_class($this));
32: }
33:
34:
35:
36: 37: 38: 39: 40: 41: 42: 43:
44: public static function get(array $arr, $key, $default = NULL)
45: {
46: foreach (is_array($key) ? $key : array($key) as $k) {
47: if (is_array($arr) && array_key_exists($k, $arr)) {
48: $arr = $arr[$k];
49: } else {
50: return $default;
51: }
52: }
53: return $arr;
54: }
55:
56:
57:
58: 59: 60: 61: 62: 63:
64: public static function & getRef(& $arr, $key)
65: {
66: foreach (is_array($key) ? $key : array($key) as $k) {
67: if (is_array($arr) || $arr === NULL) {
68: $arr = & $arr[$k];
69: } else {
70: throw new \InvalidArgumentException('Traversed item is not an array.');
71: }
72: }
73: return $arr;
74: }
75:
76:
77:
78: 79: 80: 81: 82: 83:
84: public static function mergeTree($arr1, $arr2)
85: {
86: $res = $arr1 + $arr2;
87: foreach (array_intersect_key($arr1, $arr2) as $k => $v) {
88: if (is_array($v) && is_array($arr2[$k])) {
89: $res[$k] = self::mergeTree($v, $arr2[$k]);
90: }
91: }
92: return $res;
93: }
94:
95:
96:
97: 98: 99: 100: 101: 102:
103: public static function searchKey($arr, $key)
104: {
105: $foo = array($key => NULL);
106: return array_search(key($foo), array_keys($arr), TRUE);
107: }
108:
109:
110:
111: 112: 113: 114: 115: 116: 117:
118: public static function insertBefore(array &$arr, $key, array $inserted)
119: {
120: $offset = self::searchKey($arr, $key);
121: $arr = array_slice($arr, 0, $offset, TRUE) + $inserted + array_slice($arr, $offset, count($arr), TRUE);
122: }
123:
124:
125:
126: 127: 128: 129: 130: 131: 132:
133: public static function insertAfter(array &$arr, $key, array $inserted)
134: {
135: $offset = self::searchKey($arr, $key);
136: $offset = $offset === FALSE ? count($arr) : $offset + 1;
137: $arr = array_slice($arr, 0, $offset, TRUE) + $inserted + array_slice($arr, $offset, count($arr), TRUE);
138: }
139:
140:
141:
142: 143: 144: 145: 146: 147: 148:
149: public static function renameKey(array &$arr, $oldKey, $newKey)
150: {
151: $offset = self::searchKey($arr, $oldKey);
152: if ($offset !== FALSE) {
153: $keys = array_keys($arr);
154: $keys[$offset] = $newKey;
155: $arr = array_combine($keys, $arr);
156: }
157: }
158:
159: }
160: