Skip to content

Commit c177f83

Browse files
committed
Добавлена возможность использовать в фильтре в качестве оператора статическую функцию текущего объекта.
1 parent edc281b commit c177f83

File tree

3 files changed

+63
-42
lines changed

3 files changed

+63
-42
lines changed

Enum.php

Lines changed: 51 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -105,50 +105,59 @@ public static function toArray(array $filter = [])
105105
}
106106
static::$_cacheItems[$class] = $items;
107107
}
108-
$items = array_filter(static::$_cacheItems[$class], function ($item) use ($filter) {
108+
$items = array_filter(static::$_cacheItems[$class], function ($item) use ($class, $filter) {
109109
foreach ($filter as $key => $filterItem) {
110110
if (is_int($key)) {
111-
list($operator, $key, $value) = $filterItem;
112-
switch ($operator) {
113-
case '=':
114-
if ($item[$key] != $value) {
115-
return false;
116-
}
117-
break;
118-
119-
case '!=':
120-
if ($item[$key] == $value) {
121-
return false;
122-
}
123-
break;
124-
125-
case '>':
126-
if ($item[$key] <= $value) {
127-
return false;
128-
}
129-
break;
130-
131-
case '<':
132-
if ($item[$key] >= $value) {
133-
return false;
134-
}
135-
break;
136-
137-
case '>=':
138-
if ($item[$key] < $value) {
139-
return false;
140-
}
141-
break;
142-
143-
case '<=':
144-
if ($item[$key] > $value) {
145-
return false;
146-
}
147-
break;
148-
149-
case 'in':
150-
return in_array($item[$key], $value, true);
151-
break;
111+
$operator = $filterItem[0];
112+
if (in_array($operator, ['=', '!=', '>', '<', '>=', '<=', 'in'])) {
113+
$key = $filterItem[1];
114+
$value = $filterItem[2];
115+
switch ($operator) {
116+
case '=':
117+
if ($item[$key] != $value) {
118+
return false;
119+
}
120+
break;
121+
122+
case '!=':
123+
if ($item[$key] == $value) {
124+
return false;
125+
}
126+
break;
127+
128+
case '>':
129+
if ($item[$key] <= $value) {
130+
return false;
131+
}
132+
break;
133+
134+
case '<':
135+
if ($item[$key] >= $value) {
136+
return false;
137+
}
138+
break;
139+
140+
case '>=':
141+
if ($item[$key] < $value) {
142+
return false;
143+
}
144+
break;
145+
146+
case '<=':
147+
if ($item[$key] > $value) {
148+
return false;
149+
}
150+
break;
151+
152+
case 'in':
153+
return in_array($item[$key], $value, true);
154+
break;
155+
}
156+
} else {
157+
return call_user_func_array(
158+
[$class, $operator],
159+
array_merge([$item], array_slice($filterItem, 1))
160+
);
152161
}
153162
} else {
154163
$value = $filterItem;

tests/WithDataTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ public function filterProvider()
152152
[[['in', 'number', [101, 102]]], [1, 2, 10]],
153153
[[['in', 'id', [2, 3]]], [2, 3]],
154154
[[['in', 'number', [1, 2]]], []],
155+
[[['numberMore', 101]], [2,3]],
156+
[[['numberMore', 102]], [3]],
155157
];
156158
}
157159

tests/enums/WithData.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,14 @@ public static function items()
4242
],
4343
];
4444
}
45+
46+
/**
47+
* @param array $item
48+
* @param int $v
49+
* @return bool
50+
*/
51+
public static function numberMore($item, $v)
52+
{
53+
return $item['number'] > $v;
54+
}
4555
}

0 commit comments

Comments
 (0)