Оператор ИЛИ - что я делаю не так?

Форум для авторов модов для phpBB 2.0.x.
Аватара пользователя
ALER
phpBB 2.0.0
Сообщения: 214
Зарегистрирован: 09.12.2004 0:00
Откуда: Москва
Контактная информация:

Оператор ИЛИ - что я делаю не так?

Сообщение ALER » 27.08.2007 1:54

Опять появилось немного времени, и я решил продолжить свои занятия стилем subSilverTxt. На очереди - merge-mod.

Я резко сокращаю число фолдеров топиков за счет абсолютно ненужных. Ранее было 10 фолдеров, я свожу их до четырех. Попробовал объединить их по ИЛИ (использовал or), но "номер не прошел", и я просто перебрал почти все варианты. Это было во viewtopic.php

В моде склеивания тем, в топик-листе добавляется еще десяток фолдеров - и все абсолютно ненужные. И я опять попробовал оператор ИЛИ (уже в виде ||) - и опять не получилось...

Принцип переделки под текстовые фолдеры у меня такой. Я не отслеживаю и не дублирую формирование каждого варианта фолдера, а перед формированием массива для темплейта устраиваю проверку, какой графический фолдер был выбран. Пр этом выбран может быть только один. В зависимости от результата выбирается тот или иной фолдер текстовый. Вот вариант кода, который почему-то не выполняется:

Код: Выделить всё

      if ( $folder_image == $images['folder_new'] || $images['folder_hot_new'] || $images['folder_sticky_new'] || $images['folder_announce_new'] || $images['folder_global_announce_new'] || $images['folder_global_announce_new_own'] || $images['folder_new_own'] || $images['folder_hot_new_own'] || $images['folder_sticky_new_own'] || $images['folder_announce_new_own'] ) 
      { 
      $folder_txt = $lang['Txt_folder_new_posts']; 
      } 
      else if ( $folder_image == $images['folder_locked'] || $images['folder_locked_own'] ) 
      { 
      $folder_txt = $lang['Txt_folder_no_new_posts_locked']; 
      } 
      else if ( $folder_image == $images['folder_locked_new'] || $images['folder_locked_new_own'] ) 
      { 
      $folder_txt = $lang['Txt_folder_new_posts_locked'];       
      } 
      else 
      { 
      $folder_txt = $lang['Txt_folder_no_new_posts']; 
      } 
При этом фрагменте на экране оранжевые плюсы у каждого топика, т. е. все топики обозначаются как имеющие новые посты, что не соответствует действительности. Если же сделать так:

Код: Выделить всё

      if ( $folder_image == $images['folder_new'] ) 
      { 
      $folder_txt = $lang['Txt_folder_new_posts']; 
      } 
      else if ( $folder_image == $images['folder_hot_new'] ) 
и т. д., фолдеры проверяются по одному, то все работает правильно. Но уж очень это громоздко...

Что я делаю не так?

P. S. Старался как мог соблюсти Правила форума. При предварительном просмотре тщательно сосчитанное количество строк кода = 23.
Алексей aka ALER

Аватара пользователя
RedNaxi
Former team member
Сообщения: 916
Зарегистрирован: 21.02.2007 2:05
Откуда: BeBoss.ru
Поблагодарили: 4 раза

Сообщение RedNaxi » 27.08.2007 4:09

просто нужно полностью писать условие те иф( переменная == пер1 || переменная == пер2) ваша же запись удовлетворяет синтаксису, но не решает поставленной задачи потому что условие иф (условие1 или условие2) верно в случае если хотя бы одно из условий 'условие' верно, а значит по вашей записи условие1 это что то равно чему то а условие два это просто переменная... надеюсь я достаточно понятно объяснил... пишу с телефона поэтому не могу на коде наглядно показать:(

Аватара пользователя
Veem
phpBB 1.2.0
Сообщения: 18
Зарегистрирован: 20.08.2007 5:02
Контактная информация:

Сообщение Veem » 27.08.2007 4:40

Да, именно так.
Постараюсь пояснить более наглядно.

Синтаксис условия в обобщенном случае примерно такой: if(условие1 || условие 2)
При этом условие - это выражение, а выражением является как $a=4, так и $a==4, а также просто $a.
При этом в первом случае результат - всегда TRUE (и переменная принимает значение 4), во втором - результат TRUE, если переменная содержит число 4; а в третьем - ваш случай - результат равен TRUE, только когда переменная не пуста и не равна нулю.
То есть вам нужно к значениям переменной в условии добавить ее имя в каждом случае и оператор сравнения, тогда все будет работать.
Between tomorrow and today there is a bridge across forever...

Аватара пользователя
ALER
phpBB 2.0.0
Сообщения: 214
Зарегистрирован: 09.12.2004 0:00
Откуда: Москва
Контактная информация:

Сообщение ALER » 27.08.2007 9:40

RedNaxi
Veem
Т. е. если я хочу объединить сравнения в один оператор if, я должен делать так:

Код: Выделить всё

      if ( $folder_image == $images['folder_new'] || $folder_image == $images['folder_hot_new'] || $folder_image == $images['folder_sticky_new'] || и так далее ) 
И результат будет TRUE только в том случае, если при сравнении получился хоть один TRUE.
Ясно, спасибо.
Алексей aka ALER

Аватара пользователя
Alek$
Former team member
Сообщения: 2616
Зарегистрирован: 03.08.2005 13:46
Откуда: Новосибирск
Поблагодарили: 37 раз
Контактная информация:

Сообщение Alek$ » 27.08.2007 13:26

Да, именно так.
Самая страшная ошибка, это ошибка без видимых причин и конкретных последствий.
phpBB3 [db_update.php generator]
Первая помощь по всем phpBB-вопросам: phpBB2 и phpBB3 FAQ; Правила общения;
Все консультации в icq или личке - на платной основе.

Закрыто

Вернуться в «Для авторов (phpBB 2.0.x)»