【问题标题】:if($ext == ('zip' || 'png')) { echo "Is it possible ?" }if($ext == ('zip' || 'png')) { echo "有可能吗?" }
【发布时间】:2011-01-08 19:32:58
【问题描述】:

我目前正在编写一个下载管理器,我在问自己这是否可能:

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

它每次都返回 true,所以我想这是不可能的。但是您知道我如何轻松做到这一点吗?我的意思是,不是有很多“如果”或“开关”...

还是谢谢! :)

【问题讨论】:

    标签: php operators conditional-statements


    【解决方案1】:

    你可以简单地使用:

    if($ext == 'zip' || $ext == 'png') 
    { 
       echo "It's possible";
    }
    

    【讨论】:

      【解决方案2】:
      if(($ext == 'zip') || ($ext == 'png')) { echo "It's possible." }
      

      【讨论】:

      • 我也找到了这个解决方案,但是当我有很多扩展时,写起来很长。不管怎样,谢谢你 ! :)
      【解决方案3】:

      小建议: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 数组,甚至可能在外部文件中创建一些单独的类 SupportedFileTypes,以强调程序支持的文件类型(在这种情况下,请查看 PHP and Enumerations 了解详细信息)。

      在开始开发性能问题时不必打扰您,因为编写易于阅读和未来发展/优化的代码至关重要。

      【讨论】:

        【解决方案4】:

        您可以使用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;
         }
        

        【讨论】:

        • 是的,但我想对 $ext; 中的每个扩展执行相同的说明;所以这个解决方案很长......无论如何谢谢你! :)
        • 我不明白。这个 switch-case 将完全按照您对原始代码的要求执行。每次 $ext 包含 png 或 zip 时,都会输出“It is possible”。
        • @Minishlink 可能会更长,但很容易维护。不要认为短代码 == 更好的代码。它有它的优点和缺点。
        【解决方案5】:

        这绝对是可能的,但是您在那里所做的代码不正确。这是你写的:

        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 中定义的 'empty' 或 'false' 值之一,'png' 也不是,所以你基本上是在运行这个 if 语句:

        if($ext == true)
        

        如果不为空,则为空。

        你想要的是 - 如前所述:

        if($ext == 'zip' || $ext == 'png')
        

        【讨论】:

          【解决方案6】:

          if($ext == ('zip' || 'png')) 正在按以下顺序进行比较 -> ('zip' || 'png'),因为至少有一个不为空,所以返回 TRUE。现在将其替换为($ext == TRUE),我将竭尽全力并猜测php 只是像($ext) 一样评估它,这也是正确的。

          if ( $ext == 'zip' || $ext == 'png' ) 会检查您要查找的内容。

          【讨论】:

            【解决方案7】:
            if (in_array($ext, array('png', 'zip'))) {
                echo "Is it possible ?"
            }
            

            如果您多次需要,该数组可以存储在某个地方。

            【讨论】:

              【解决方案8】:

              你可以使用in_array($ext,array('png','zip','another','more'))

              请看这里:http://php.net/manual/en/function.in-array.php

              【讨论】:

              • 不要不,可能取决于你这样做的次数......无论如何,这是我脑海中突然出现的第一件事:)
              • @Minishlink:虽然解析正则表达式和构建 DFA 也需要时间,但两者都可能是 O(n)。
              • 另一种解决方案是使用扩展作为索引的键。那将只有 O(1)(初始化后):array_key_exists($ext, array_fill_keys(array('png','zip'), null)).
              • 我刚刚做了一些经验,我计算了1°in_array解决方案2°regex解决方案的页面执行时间5次。这里是我的结果:(秒)1)in_array(0.073891162872314 + 0.064849138259888 + 0.074558973312378 + 0.064404964447021 + 0.062700033187866)/ 5 = 0.0680808544s 2)的正则表达式(0.076596021652222 + 0.063315153121948 + 0.071804046630859 + 0.074262142181396 + 0.074447154998779)/ 5 = 0.0720849038s 1 W0N !所以在我的情况下 in_array 更好。
              • @Minishlink 很好,虽然 5 次迭代几乎不是基准;)
              【解决方案9】:

              你可以使用正则表达式,例如

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

              相关问题:Checking for file-extensions in PHP with Regular expressions

              【讨论】:

              • 天哪,我完全忘记了正则表达式...谢谢! =)
              • 这似乎是对正则表达式的使用不当,对当前问题的解决方案不佳。
              猜你喜欢
              • 2018-02-06
              • 1970-01-01
              • 2023-03-07
              • 2018-06-29
              • 2011-09-10
              • 2020-02-05
              • 2020-07-27
              • 1970-01-01
              • 2016-08-21
              相关资源
              最近更新 更多