【问题标题】:PHP "or" operator within conditional statement - newb question!条件语句中的 PHP“或”运算符 - 新问题!
【发布时间】:2011-04-07 17:38:40
【问题描述】:

请原谅我之前已经介绍过,我搜索无济于事。

我有一个脚本可以查看目录以查找其中的文件。有一个条件行只查找具有特定扩展名的文件:

if(strtolower(substr($file, -3)) == "mp4"){...

所以它只会查找带有“mp4”扩展名的文件。

我需要添加一些“或”运算符来添加另外两种扩展类型。我尝试了以下方法,但没有成功:

if(strtolower(substr($file, -3)) == "mp4" || == "mov" || == "flv"){...

现在该行似乎被忽略了,它获取了目录中的每个文件。 如果有人可以帮助我,我将不胜感激! 我知道这可能是最基本的,但我对 PHP 的掌握非常有限(尽管我确实看到了它的美!!!)

提前致谢。

【问题讨论】:

  • 请注意,文件扩展名的长度可能多于或少于三个字符。最好使用正则表达式或在每次出现点时拆分名称并取最后一部分。

标签: php


【解决方案1】:

您尝试的方式不起作用,因为比较运算符 ==binary operator 并且需要两个操作数,即 operand1 == operand2。这同样适用于也是二元运算符的逻辑 OR 运算符,即operand1 || operand2

这意味着你需要这样写:

$ext = strtolower(substr($file, -3));
if ($ext == "mp4" || $ext == "mov" || $ext == "flv")

这里$ext只是用来避免重复调用strtolower(substr($file, -3))。在这种情况下,每个二元运算符都有两个操作数:

((($ext == "mp4") || ($ext == "mov")) || ($ext == "flv"))
   \__/    \___/
     \__==___/        \__/    \___/
         \              \__==___/
          \_______||_______/
                   \                      \__/    \___/
                    \                       \__==___/
                     \________________||_______/

我添加了括号以突出显示表达式的计算顺序。

所以你必须这样写。

但你也可以使用数组和in_array:

in_array(strtolower(substr($file, -3)), array("mp4","mov","flv"))

pathinfo 获取文件扩展名可能更好,所以:

in_array(pathinfo($file, PATHINFO_EXTENSION), array("mp4","mov","flv"))

【讨论】:

  • @Gumbo - 虽然你的回答很好,但它目前并没有真正解决 OP 的问题,这就是他的“或”不起作用的原因。我知道这里的其他答案已经涵盖了它,但请考虑添加一个简短描述,说明他的代码为什么不起作用,我会给你一个 +1。
  • @Gumbo - 先生,我认为可以。至少还不错。 :p.
  • 非常感谢大家的回答,非常感谢!
  • @Jacob Schindler:不客气。不要忘记接受答案。
【解决方案2】:

$ext = strtolower(substr($file, -3));

开关 ( $ext ) { 案例“mp4”: 案例“移动”: 案例“flv”: /// 一些操作 休息; }

【讨论】:

  • 这不是很灵活。我也会考虑这种糟糕的编码。 in_array() 会容易得多。他们编写代码的方式将要求开发人员在想要添加新文件类型(例如将来的 mp5)时编写额外的代码行。代码应该使用变量,你不应该写变量代码。
【解决方案3】:

如果您想使用|| 进行比较,语法如下:

if(strtolower(substr($file, -3)) == "mp4" || strtolower(substr($file, -3)) == "mov" || strtolower(substr($file, -3)) == "flv"){...

当然要让它更快一点,在变量中填充strtolower(substr($file, -3)),这样php就不会多次执行这些函数:

$extension=strtolower(substr($file, -3));
if($extension == "mp4" || $extension == "mov" || $extension == "flv"){...

另一个好消息是,PHP 有一个内置函数来搜索值是否存在于值数组中(in_array):

if(in_array(strtolower(substr($file, -3)), array('mp4', 'mov', 'flv')))

最后一件事,如果你有这样的简单字符串,那些你不希望 php 扩展变量和里面的东西的字符串,use single qutations instead of doubles,这是一个很好的做法,可以节省一些执行时间(当然几乎没有注意到一两个字符串,但这是一个很好的长距离练习)。

【讨论】:

    【解决方案4】:

    如果您只想匹配目录中的特定文件名,可以使用glob

    $files = glob('/path/to/dir/*.{mp4,mov,flv}', GLOB_BRACE);
    

    返回匹配文件路径的数组。

    或者您使用fnmatch 将文件名与模式匹配。

    此外,如果您想确保图像是真正的图像,请考虑使用checking against the MimeType 代替扩展名或作为扩展名的补充

    【讨论】:

    • 如果您想循环浏览文件目录,这是一个很好的解决方案。但是,如果您正在上传文件或需要检查一个文件,则 in_array() 解决方案被证明是更好的解决方案。
    • @cdburgess 我有一个脚本可以查看目录以查找其中的文件听起来不像只上传或检查单个文件(您仍然可以使用 @987654327 @)。
    • 我更多的是在谈论 glob。但是,也许您可​​以更新您的评论以显示 fnmatch 的一个很好的例子。
    【解决方案5】:

    另一种方法:

    if ( in_array(strtolower(substr($file, -3))),  array('mp4', 'mov', 'flv') ) {
        // do something
    }
    

    【讨论】:

    • 我认为这是最好的解决方案。文件类型的数组可以扩展(或从数据库自动化)并且不影响代码的功效。这是解决这个问题的最优雅的方法。
    【解决方案6】:

    问题在于 PHP 不会自动知道您要在每个“或”部分中与 strtolower(substr($file, -3)) 进行比较。您需要明确说明:

    if(strtolower(substr($file, -3)) == "mp4" || strtolower(substr($file, -3)) == "mov" || strtolower(substr($file, -3)) == "flv"){...
    

    请注意,这样做可能会更整洁:

    $tmp = strtolower(substr($file, -3));
    
    if($tmp == "mp4" || $tmp == "mov" || $tmp == "flv"){...
    

    【讨论】:

    • 我不是 PHP 专家,但使用 strcmp 比较字符串不是更好吗?我想有这样一个功能是有充分理由的。
    • @Bevor:唯一的原因是“因为 C 也有那个功能”。
    【解决方案7】:

    更简洁的方式:

    if ( preg_match('/(mp4|mov|flv)$/', $file) ) { ...
    

    【讨论】:

    • 这不是好的编码习惯。用户正在寻找特定的扩展名。这将在以下文件上返回 true:mymoviescript.txt,因为在文件名中找到了mov。这是错误的代码。
    • @cdburgess:这是错误的,请注意 $ 锚,它将搜索限制在字符串的末尾。在指责代码不好之前请理解正则表达式。
    • 我很抱歉。我完全错过了$
    【解决方案8】:
     $ext = strtolower(substr($file, -3));
    
     if($ext == "mp4" || $ext == "mov" || $ext == "flv"){...
    

    【讨论】:

    • 添加 15 个扩展时会发生什么?您最终会在一个非常笨拙的 IF 语句中得到一堆 || $ext == 'blah' 语句。虽然这是一个可行的解决方案,但使用 in_array() 会更好。
    猜你喜欢
    • 2011-08-09
    • 2011-02-18
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 2015-11-07
    • 2021-09-10
    • 2012-09-20
    相关资源
    最近更新 更多