1: <?php defined('_JOOS_CORE') or exit();
2:
3: /**
4: * Библиотека расширенной работы с массивами
5: *
6: * @version 1.0
7: * @package Core\Libraries
8: * @subpackage Array
9: * @category Libraries
10: * @author Joostina Team <info@joostina.ru>
11: * @copyright (C) 2007-2012 Joostina Team
12: * @license MIT License http://www.opensource.org/licenses/mit-license.php
13: * Информация об авторах и лицензиях стороннего кода в составе Joostina CMS: docs/copyrights
14: *
15: * */
16: class joosArray
17: {
18: /**
19: * ArrayTools::get_position()
20: *
21: * Определение позиции (порядкового номера) элемента массива по ключу
22: *
23: * @param mixed $array
24: * @param mixed $cur
25: *
26: * @return integer Порядковый номер элемента в массиве
27: */
28: public static function get_position(array $array, $cur)
29: {
30: $i = 0;
31: foreach ($array as $key => $val) {
32: if ($key == $cur) {
33: return $i;
34: }
35: $i++;
36: }
37:
38: return null;
39: }
40:
41: /**
42: * Возвращает срез массива по заданным параметрам:
43: *
44: * @param array $array Исходный массив
45: * @param mixed $cur_key Ключ "текущего" элемента (вокруг которого делаем срез)
46: * @param integer $prev Количество элементов, предшествующих текущему
47: * @param integer $next Количество элементов, следуемых за текущим
48: * @param bool $static_count Флаг, повзоляющий всегда сохранять требуемое количество элементов в возвращаемом массиве
49: *
50: * @return array
51: *
52: * TODO: добавить возможность не вычислять позицию элемента, если в качестве ключа передается реальный порядковый номер
53: */
54: public static function get_next_prev($array, $cur_key, $prev = 3, $next = 5, $static_count = false)
55: {
56: $position = self::get_position($array, $cur_key);
57: $offset = $position - $prev > 0 ? $position - $prev : 0;
58: $length = $prev + $next + 1;
59:
60: if ($static_count) {
61: $count = count($array);
62: $last_index = $count - 1;
63:
64: if (($last_index - $offset) < ($prev + $next)) {
65: $offset = $offset + ($last_index - $offset) - ($prev + $next);
66: }
67: }
68:
69: return array_slice($array, $offset, $length, true);
70: }
71:
72: }
73: