1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10:
11:
12: namespace Nette\Utils;
13:
14: use Nette;
15:
16:
17:
18: 19: 20: 21: 22:
23: final class Arrays
24: {
25:
26: 27: 28:
29: final public function __construct()
30: {
31: throw new Nette\StaticClassException;
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: if (func_num_args() < 3) {
51: throw new Nette\InvalidArgumentException("Missing item '$k'.");
52: }
53: return $default;
54: }
55: }
56: return $arr;
57: }
58:
59:
60:
61: 62: 63: 64: 65: 66:
67: public static function & getRef(& $arr, $key)
68: {
69: foreach (is_array($key) ? $key : array($key) as $k) {
70: if (is_array($arr) || $arr === NULL) {
71: $arr = & $arr[$k];
72: } else {
73: throw new Nette\InvalidArgumentException('Traversed item is not an array.');
74: }
75: }
76: return $arr;
77: }
78:
79:
80:
81: 82: 83: 84: 85: 86:
87: public static function mergeTree($arr1, $arr2)
88: {
89: $res = $arr1 + $arr2;
90: foreach (array_intersect_key($arr1, $arr2) as $k => $v) {
91: if (is_array($v) && is_array($arr2[$k])) {
92: $res[$k] = self::mergeTree($v, $arr2[$k]);
93: }
94: }
95: return $res;
96: }
97:
98:
99:
100: 101: 102: 103: 104: 105:
106: public static function searchKey($arr, $key)
107: {
108: $foo = array($key => NULL);
109: return array_search(key($foo), array_keys($arr), TRUE);
110: }
111:
112:
113:
114: 115: 116: 117: 118: 119: 120:
121: public static function insertBefore(array &$arr, $key, array $inserted)
122: {
123: $offset = self::searchKey($arr, $key);
124: $arr = array_slice($arr, 0, $offset, TRUE) + $inserted + array_slice($arr, $offset, count($arr), TRUE);
125: }
126:
127:
128:
129: 130: 131: 132: 133: 134: 135:
136: public static function insertAfter(array &$arr, $key, array $inserted)
137: {
138: $offset = self::searchKey($arr, $key);
139: $offset = $offset === FALSE ? count($arr) : $offset + 1;
140: $arr = array_slice($arr, 0, $offset, TRUE) + $inserted + array_slice($arr, $offset, count($arr), TRUE);
141: }
142:
143:
144:
145: 146: 147: 148: 149: 150: 151:
152: public static function renameKey(array &$arr, $oldKey, $newKey)
153: {
154: $offset = self::searchKey($arr, $oldKey);
155: if ($offset !== FALSE) {
156: $keys = array_keys($arr);
157: $keys[$offset] = $newKey;
158: $arr = array_combine($keys, $arr);
159: }
160: }
161:
162:
163:
164: 165: 166: 167: 168: 169: 170:
171: public static function grep(array $arr, $pattern, $flags = 0)
172: {
173: Nette\Diagnostics\Debugger::tryError();
174: $res = preg_grep($pattern, $arr, $flags);
175: if (Nette\Diagnostics\Debugger::catchError($e) || preg_last_error()) {
176: throw new RegexpException($e ? $e->getMessage() : NULL, $e ? NULL : preg_last_error(), $pattern);
177: }
178: return $res;
179: }
180:
181:
182:
183: 184: 185: 186: 187:
188: public static function flatten(array $arr)
189: {
190: $res = array();
191: array_walk_recursive($arr, function($a) use (& $res) { $res[] = $a; });
192: return $res;
193: }
194:
195: }
196: