Проблема с И - ИЛИ

mychatik

Premium
Premium
26.05.15
429
322
mychatik.ru
#1
Вроде бы с логикой ничего сложного и всё понятно, но возникла небольшая проблема.

В чате у меня стоит автовыдача амулетов. И одновременно есть 2 человека, которые КАТЕГОРИЧЕСКИ не приемлют у себя амулеты.

Для них я специально написал так:

PHP:
if (($is_regist != 13) || ($is_regist != 201)) include ($file_path."modules/auto_amulet/auto_amulet.php");

Логика проста: Если у юзера ID НЕ 13 ИЛИ НЕ 201 - то выдаём амулет.
Всё работает. Амулеты выдаются всем и НЕ выдаётся - только первому, с ID 13. Второму, с ID 201 - амулет всё равно выдаётся, что постоянно вызывает кучу недовольства.

Что у меня неверно с логикой в этом выражении?
Перебирать какие-то другие варианты на юзерах - довольно сложно.
Нужно ждать набора рейтинга и очередного этапа выдачи амулета... А это очень долго.
 

mr.weirdness

Пользователь
Проверенный +++
11.03.16
37
4
#2
mychatik, ИЛИ предполагает, что должно выполняться хотя бы одно условие.
в случае с ID = 201 истиной является первое утверждение. id != 13, поэтому амуль выдается. Почему он НЕ выдается 13-му - загадка за семью печатями. Тебе надо использовать "И" и писать так:

Код:
if (($is_regist != 13) && ($is_regist != 201))
include ($file_path."modules/auto_amulet/auto_amulet.php");
В этом случае auto_amulet.php будет инклудиться для всех у кого ид не 13 и не 201.
Если же ид равен или 13 или 201 код в эту ветку не пойдет, потому что одно из условий будет не выполнено.
Можешь сделать еще универсальнее:
Код:
$no_amul = array( ......... перечисли все айдишники кому амули не выдавать ......... );
if ( !in_array($is_regist, $no_amul))
include ($file_path."modules/auto_amulet/auto_amulet.php");
 
Последнее редактирование:

Rain

Администратор
Команда форума
04.09.14
334
281
28
#3
mr.weirdness, mychatik,
PHP:
if ($is_regist != 13 && $is_regist != 201) include ($file_path."modules/auto_amulet/auto_amulet.php");
И все. Не нужно городить огород с массивами для 2-х пользователей.
P.S. Учитесь писать без скобок в условии.
 

mr.weirdness

Пользователь
Проверенный +++
11.03.16
37
4
#4
Rain, что касается скобок - они были в оригинале, я только внес необходимое исправление.
Что касается массива, читайте - вариант универсальный. Если у вас будет 100 таких пользователей, смею заверить, Вы о массиве/файле/базе исключений задумаетесь сами)
 

Rain

Администратор
Команда форума
04.09.14
334
281
28
#5
mr.weirdness, я написал что для именно 2-х пользователей массив не имеет смысла. О 100 и речи не шло. Читайте внимательней.
 

mr.weirdness

Пользователь
Проверенный +++
11.03.16
37
4
#6
Rain, я читаю достаточно внимательно.
Просто исповедую, видимо, немного иной подход к разработке нежели Вы.
В случае с двумя пользователями нужды в массиве действительно нет. Но когда нужда возникнет, Вам придется либо ручками дописывать условия для каждого пользователя. Я добавлю только одно значение в массив. Работа администратора ресурса должна быть как можно менее трудозатратной.
Когда дело касается подобной мелочи и в одном месте, ошибиться сложно, но можно. А когда вам надо будет добавить это условие в несколько разных мест, с десятком значений вы будете писать функцию, которая выполняет типовую задачу. Я напишу ее сразу, а вы потом будете переписывать ваш код :)
При этом заметьте, я совсем не говорю, что вы неправы. У нас разные подходы.
 

Rain

Администратор
Команда форума
04.09.14
334
281
28
#7
mr.weirdness, ну а что помешает администратору ресурса вставить массив если пользователей станет действительно больше 2 или 5? Да и к тому же, ручками все равно придется добавлять пользователей, что с условиями что без.
Трудозатратность при этом одинаковая.
А когда вам надо будет добавить это условие в несколько разных мест
Вы здесь не предлагаете писать функцию. В случае, если мы напишем проверку массива в одном месте, то например, в профиле или еще где-то придется писать то же самое. Для удобства да, согласен, нужно сделать функцию и проверять по функции условие. Но опять же, в данном случае это ни к чему.
Вот именно. Когда возникнет. В контексте смысла существования чата и мотивации аудитории вероятность этого стремится к нулю.
Мы говорим не о подходе а о конкретном случае.
Я напишу ее сразу, а вы потом будете переписывать ваш код :)
При правильном проектировании такого не будет, а писать функцию для единоразового использования - расточительство рабочего времени.
Я никоим образом не пытаюсь Вас переубедить. Моя позиция - в конкретном случае, при 1-2-3-4 пользователях, массив и функции как минимум бесполезны.