if ($ ext == ('zip' || 'png')) {echo "Возможно ли это?" } - PullRequest
8 голосов
/ 24 января 2010

Я сейчас пишу менеджер загрузок и спрашиваю себя, возможно ли это:

if($ext == ('zip' || 'png')) { echo "Is it possible ?" }

Он возвращает истину каждый раз, так что я думаю, что это невозможно. Но есть ли у вас представление о том, как я мог бы легко это сделать? Я имею в виду, не с множеством "если" или "переключателем" ...

Спасибо в любом случае! :)

Ответы [ 8 ]

22 голосов
/ 24 января 2010

вы можете использовать in_array($ext,array('png','zip','another','more'))

см. Здесь: http://php.net/manual/en/function.in-array.php

11 голосов
/ 24 января 2010

if($ext == ('zip' || 'png')) выполняет сравнение в следующем порядке -> ('zip' || 'png'), который, поскольку хотя бы один не равен нулю, возвращает TRUE. Замените это сейчас, ($ext == TRUE), которое я собираюсь вывести на конечность и предположить, что php просто оценивает это так же, как и ($ext), что также верно.

if ( $ext == 'zip' || $ext == 'png' ) проверит, что вы ищете.

5 голосов
/ 24 января 2010

Вы можете использовать оператор switch-case :

switch($ext)
{ 
  case 'png':
  case 'zip':
       // Will run for both 'png' and 'zip'
       echo "It is possible";
       break;
  default:
       echo "unknown extension!";
       break;
 }
3 голосов
/ 24 января 2010
if(($ext == 'zip') || ($ext == 'png')) { echo "It's possible." }
3 голосов
/ 24 января 2010

Вы можете использовать регулярные выражения, например,

if(preg_match("/^(zip|png)$/", $ext) { echo “It is possible!” }

Схожий вопрос: Проверка расширений файлов в PHP с помощью регулярных выражений

2 голосов
/ 25 января 2010

Крошечный совет: PHP использует похожую на C обработку логического типа в том смысле, что фактически любое ненулевое значение считается «истинным» в случае нахождения в условной части оператора if-if. например, если вы пропустите символ '=' в конструкции сравнения и наберете if($var = "val") вместо if($var == "val"), вы всегда получите истинное значение в этом утверждении, потому что оператор '=' вернется в результате значения операции set из правая часть «val», которая в свою очередь преобразуется в «true». так что лучше написать литерал в левой части условия сравнения if("val" == $var), потому что в этом случае вы получите ошибку, если потеряете один символ '=' в сравнении ==.

поэтому ваше if-выражение должно выглядеть так: if('zip' == $ext || 'png' == $ext) { echo "Is it possible ?" }

также, вероятно, было бы лучше поместить литералы 'zip' и 'png' в константы с именами FILE_TYPE_ZIP, FILE_TYPE_PNG или определить некий перечислимый объект, такой как глобальный PHP-массив, который находится в верхней части исходной страницы или, возможно, даже создайте некоторый отдельный класс SupportedFileTypes во внешнем файле, который будет выделять поддерживаемые типы файлов вашей программы (в этом случае проверьте PHP и перечисления для получения подробной информации).

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

2 голосов
/ 24 января 2010

Это определенно возможно, но то, что вы делаете, это неверный код. Вот что вы написали:

if($ext == ('zip' || 'png')) { echo "Is it possible ?" }

А вот что переводится в php:

if( (if $ext evaluates to true then return true) == ( if 'zip' evaluates to true then return true || if 'png' evaluates to true then return true ) )

Итак, поскольку zip не является одним из «пустых» или «ложных» значений, определенных в php, и не является «png», вы в основном выполняете оператор if:

if($ext == true)

Что, если оно не пустое, это так.

То, что вы хотите - как уже упоминалось ранее:

if($ext == 'zip' || $ext == 'png')
1 голос
/ 24 января 2010
if (in_array($ext, array('png', 'zip'))) {
    echo "Is it possible ?"
}

Массив может храниться где-то, если вам это нужно несколько раз.

...