Вводная: в игре 200 уровней, 118 единиц техники, 22 постройки, 10 операций, 100 миссий и т.д., они соответствуют уровню игрока. При получении нового уровня эта вся муть потихоньку добавляется, если уровень совпал с уровнем игрока.
$this->user->log_unit = $this->setProperty('unit');
$this->user->log_building = $this->setProperty('building');
$this->user->log_operation = $this->setProperty('operation');
$this->user->log_mission = $this->setProperty('mission');
Старый вариант добавления: в этом случае производится лишний запрос на проверку, ДАЖЕ если уровень не совпадёт и вставку делать не нужно.
private function setProperty($property)
{
if ($this->user->log_level) {
$data = $this->pdo('select * from ' . $property . 's where lvl = ? limit 1', [
$this->user->lvl
])->fetch();
if ($data) {
$this->pdo('insert into users_' . $property . 's set id = ?, id_' . $property . ' = ?', [
$this->user->id,
$data->{'id_' . $property}
]);
return $data;
}
}
return false;
}
Новый вариант: выборка производится, если уровень пользуна есть в массиве добавляемого элемента
private function setProperty($property)
{
$array = [
'unit' => [1, 2, 3, 6, 7, 8, 9, 11, 12, 13, 14, 16, 18, 19, 20, 24, 25, 26, 30, 31, 32, 36, 37, 38, 42, 43, 44, 48, 49, 50, 54, 55, 56, 60, 61, 62, 65, 66, 67, 68, 69, 70, 72, 73, 74, 78, 79, 80, 84, 85, 86, 90, 91, 92, 96, 97, 98, 102, 103, 104, 106, 107, 108, 109, 110, 111, 114, 115, 116, 120, 121, 122, 126, 127, 128, 131, 132, 133, 134, 138, 139, 140, 141, 142, 144, 145, 146, 150, 151, 152, 156, 157, 158, 161, 162, 163, 165, 167, 169, 171, 173, 174, 175, 177, 178, 180, 181, 182, 186, 187, 188, 192, 193, 194, 197, 198, 199, 200],
'building' => [1, 2, 3, 21, 22, 35, 43, 44, 64, 66, 68, 85, 88, 101, 106, 110, 127, 132, 134, 154, 167, 176],
'operation' => [1, 15, 30, 45, 60, 75, 90, 105, 120, 135],
'mission' => [1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 105, 107, 109, 111, 113, 115, 117, 119, 121, 123, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153]
];
if ($this->user->log_level and in_array($this->user->lvl, $array[$property])) {
$data = $this->pdo('select * from ' . $property . 's where lvl = ? limit 1', [
$this->user->lvl
])->fetch();
if ($data) {
$this->pdo('insert into users_' . $property . 's set id = ?, id_' . $property . ' = ?', [
$this->user->id,
$data->{'id_' . $property}
]);
return $data;
}
}
return false;
}
Вопрос: насколько надёжно так производить проверку, а то эти массивы чисто зрительно как-то не внушают доверия )))
Смысл: не производить запрос к БД, если нет соответствия.
А если я из админки отредачу элемент какой поменяю ему уровень или добавлю новый элемент или уровни добавлю игрокам, лазить в рукописный массив?
Как быть? Может элегантнее есть решения?