PHP проверяет значение на несколько значений с помощью OR-оператора

У меня есть имя файла ( $fname ), и мне нужно назначить $pClass типу файла с "-" потом. В настоящее время я всегда получаю text- – независимо от того, какой тип файла он есть.

 //This gets the extention for the file and assigns the class to the icon <i> $pieces = explode('.', $fname); $ext = array_pop($pieces); if($ext == (('txt')||('rtf')||('log')||('docx'))){ $pClass = 'text-'; } else if($ext == (('zip')||('sitx')||('7z')||('rar')||('gz'))){ $pClass = 'archive-'; } else if($ext == (('php')||('css')||('html')||('c')||('cs')||('java')||('js')||('xml')||('htm')||('asp'))){ $pClass = 'code-'; } else if($ext == (('png')||('bmp')||('dds')||('gif')||('jpg')||('psd')||('pspimage')||('tga')||('svg'))){ $pClass = 'image-'; } else { $pClass = ''; } 

Почему не работает оператор if if с оператором OR?

Логический || (OR) не работает, поскольку вы ожидаете его работы. || оператор всегда вычисляет логическое значение TRUE или FALSE. Итак, в вашем примере ваши строки преобразуются в булевы, а затем сравниваются.

Если утверждение:

 if($ext == ('txt' || 'rtf'|| 'log' || 'docx')) 

Доходит до:

 if($ext == (TRUE || TRUE || TRUE || TRUE)) if($ext == TRUE) 

Чтобы решить эту проблему и заставить код работать так, как вы хотите, вы можете использовать разные методы.

Множественное сравнение

Один из способов решения проблемы и проверки ваших значений на несколько значений – это фактически сравнить значение с несколькими значениями:

 if($ext == "txt" || $ext == "rtf" /* || ... */) 

in_array()

Другой способ – использовать функцию in_array() и проверить, равно ли это значение одному из значений массива:

 if(in_array($ext, ["txt", "rtf" /* , ... */], TRUE)) 

Примечание. Второй параметр предназначен для строгого сравнения

switch()

Вы также можете использовать switch чтобы проверить свое значение на несколько значений, и просто пропустите этот случай.

 switch($ext){ case "txt": case "rtf": /* case ...: */ $pClass = "text-"; break; } 

Я просто изменил бы это на что-то вроде этого:

 //This gets the extention for the file and assigns the class to the icon <i> $pieces = explode('.', $fname); $ext = array_pop($pieces); if(in_array($ext,array('txt','rtf','log','docx'))){ $pClass = 'text-'; }elseif(in_array($ext,array('zip','sitx','7z','rar','gz'))){ $pClass = 'archive-'; }elseif(in_array($ext,array('php','css','html','c','cs','java','js','xml','htm','asp'))) { $pClass = 'code-'; }elseif(in_array($ext,array('png','bmp','dds','gif','jpg','psd','pspimage','tga','svg'))){ $pClass = 'image-'; }else { $pClass = ''; } 

Вы можете использовать in_array() для сравнения значения с несколькими строками:

 if(in_array($ext, array('txt','rtf','log','docx')){ // Value is found. }