Я пытаюсь разобрать «строку правил», предоставляемую через API в PHP.
Учитывая, что у меня есть массив предметов, таких как
$items = [41, 42, 51, 54, 65, 12];
Я хочу оценить это выражение
({41} AND {51}) OR ({31} AND {42})
В этом случае он должен вернуть true, так как массив $ items содержит как 41, так и 51 элемент.
Я начал с создания токенизатора, используя https://github.com/nette/tokenizer библиотека и в настоящее время она разбирает строку в массив токенов.
array:25 [
0 => array:3 [
0 => "("1 => 0
2 => 1
]
1 => array:3 [
0 => "{"1 => 1
2 => 2
]
2 => array:3 [
0 => "41"1 => 2
2 => 3
]
3 => array:3 [
0 => "}"1 => 4
2 => 4
]
4 => array:3 [
0 => " "1 => 5
2 => 8
]
5 => array:3 [
0 => "AND"1 => 6
2 => 5
]
6 => array:3 [
0 => " "1 => 9
2 => 8
]
7 => array:3 [
0 => "{"1 => 10
2 => 2
]
8 => array:3 [
0 => "51"1 => 11
2 => 3
]
9 => array:3 [
0 => "}"1 => 13
2 => 4
]
10 => array:3 [
0 => ")"1 => 14
2 => 7
]
11 => array:3 [
0 => " "1 => 15
2 => 8
]
12 => array:3 [
0 => "OR"1 => 16
2 => 6
]
13 => array:3 [
0 => " "1 => 18
2 => 8
]
14 => array:3 [
0 => "("1 => 19
2 => 1
]
15 => array:3 [
0 => "{"1 => 20
2 => 2
]
16 => array:3 [
0 => "31"1 => 21
2 => 3
]
17 => array:3 [
0 => "}"1 => 23
2 => 4
]
18 => array:3 [
0 => " "1 => 24
2 => 8
]
19 => array:3 [
0 => "AND"1 => 25
2 => 5
]
20 => array:3 [
0 => " "1 => 28
2 => 8
]
21 => array:3 [
0 => "{"1 => 29
2 => 2
]
22 => array:3 [
0 => "42"1 => 30
2 => 3
]
23 => array:3 [
0 => "}"1 => 32
2 => 4
]
24 => array:3 [
0 => ")"1 => 33
2 => 7
]
]
Однако здесь у меня заканчиваются таланты, и я не уверен, как обработать токены, чтобы выполнить условие для моего массива $ items.
Может быть, я подхожу к этому совершенно неправильно.
Задача ещё не решена.
Других решений пока нет …