if($ext == ('zip' || 'png')) { echo “Is it possible ?” }
我现在正在写一个下载管理器,我问自己这是否可行:
1
| if($ext == ('zip' || 'png')) { echo"Is it possible ?" } |
它每次都会返回真值,所以我想这是不可能的。但你知道我怎么能轻松做到这一点吗?我的意思是,没有足够的"if"或"switch"…
无论如何,谢谢!:)
你可以用in_array($ext,array('png','zip','another','more'))。
请参见:http://php.net/manual/en/function.in-array.php
- 它也可以工作,但它比regex更快吗?
- 不,不,可能取决于你做的次数…不管怎样,这是第一件事,我突然想到:)
- @minisqink:both可能是o(n),不过解析正则表达式和构建dfa也需要时间。
- 另一种解决方案是使用扩展作为索引的键。只有O(1)(初始化后):array_key_exists($ext, array_fill_keys(array('png','zip'), null))。
- 好的,谢谢你的精确性。:)
- 我刚刚做了一些经验,我已经为1&176;in array solution 2&176;regex解决方案计算了5次页面的执行时间。Here are my results: (in seconds) 1) in_array (0.073891162872314+0.064849138259888+0.074558973312378+0.064??404964447021+0.06270??0033187866)/5 = 0.0680808544s 2) regex (0.076596021652222+0.063315153121948+0.071804046630859+0.074??262142181396+0.07444??7154998779)/5 = 0.0720849038s 1<2 : in_array W0N !所以在我的例子中数组更好。
- 是我,我是赢家!D
- 很高兴知道,祝贺你!-)
- @minisqink很好,虽然5次迭代很难作为基准;)
if($ext == ('zip' || 'png'))按以下顺序进行比较->('zip' || 'png'),因为至少有一个不为空,所以返回true。现在,用($ext == TRUE)代替它,我要冒险去猜测,php只是和($ext)一样对它进行评估,这也是正确的。
if ( $ext == 'zip' || $ext == 'png' )将检查您要查找的内容。
您可以使用switch case语句:
1 2 3 4 5 6 7 8 9 10 11
| switch($ext)
{
case 'png':
case 'zip':
// Will run for both 'png' and 'zip'
echo"It is possible";
break;
default:
echo"unknown extension!";
break;
} |
- 是的,但是我想对$ext中的每个扩展执行相同的指令;所以这个解决方案非常长…无论如何,谢谢你!:)
- 我不明白。这个开关盒将完全满足您对原始代码的需求。每当$ext包含png或zip时,"它是可能的"将被输出。
- @minisqink可能更长,但维护起来很容易。不要认为短代码==更好的代码。它有利弊之分。
1
| if(($ext == 'zip') || ($ext == 'png')) { echo"It's possible." } |
- 我也找到了这个解决方案,但是当我有很多扩展时,编写起来相当长。无论如何,谢谢你!:)
您可以使用正则表达式,例如
1
| if(preg_match("/^(zip|png)$/", $ext) { echo"It is possible!" } |
相关问题:使用正则表达式检查PHP中的文件扩展名
- 哦,天哪,我完全忘了瑞格斯……谢谢您!=)
- 这似乎是对regex的糟糕使用,以及对当前问题的糟糕解决方案。
小建议:PHP使用类似于C布尔类型处理的方法,在某种意义上,如果驻留在if-语句的条件部分,那么任何非零值都被认为是"真的"。例如,如果在比较构造中缺少"="符号,并且键入if($var ="val")而不是if($var =="val"),则在该语句中始终会得到一个真值,因为"="运算符将返回右部分"val"的设置操作值,而该部分反过来转换为"true"。所以最好在比较条件if("val" == $var)的左边写一个字,因为在这种情况下,如果在=='比较中松开一个='符号,就会出错。
所以你的if语句必须如下所示:if('zip' == $ext || 'png' == $ext) { echo"Is it possible ?" }
另外,最好将"zip"和"png"文本放在名为file_type_zip、file_type_png的常量中,或者定义一些枚举实体(如位于源页面顶部的全局php数组),或者甚至在外部文件中创建一些单独的类支持的file types,以强调您的pr支持的文件类型。(在这种情况下,请查看PHP和枚举以了解详细信息)。
在开发开始时,性能问题不必麻烦您,因为编写代码是非常重要的,这在将来很容易阅读和发展/优化。
这是绝对可能的,但你所做的是错误的代码。这是你写的:
1
| if($ext == ('zip' || 'png')) { echo"Is it possible ?" } |
下面是用PHP翻译的内容:
1
| 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中定义的"empty"或"false"值之一,而且"png"也不是,所以您基本上运行的是if语句:
如果不是空的,就是空的。
你想要的是-如前所述:
1
| if($ext == 'zip' || $ext == 'png') |
1 2 3
| if (in_array($ext, array('png', 'zip'))) {
echo"Is it possible ?"
} |
如果多次需要,可以将数组存储在某个地方。