【问题标题】:Is there a shortcut to writing multiple conditions in php?有没有在php中编写多个条件的捷径?
【发布时间】:2012-01-18 22:22:52
【问题描述】:

有没有更短的写法(不使用正则表达式或字符串匹配函数)?

if($page=='page1.php' || $page=='page2.php' || $page=='page3.php' || $page=='page4.php'){ do something...}

我正在寻找类似的东西:

if($page==('page1.php', 'page2.php', 'page3.php', 'page4.php')){do something...}

但我知道这是不正确的。有什么建议吗?

【问题讨论】:

  • 我假设这些值实际上不是 page1.php、page2.php 等,它们是占位符?还是这实际上是您的代码要检查的内容?
  • Compare multiple values in PHP 的可能重复项
  • 是的...非常接近重复...我找了 5 分钟,找不到与我类似的问题...所以我发布了它。
  • 无论如何,我认为和另一个一样,in_array 可能是最好的解决方案
  • 在使用associative array keys 时查看马里奥链接到的问题的最新答案。 in_array 必须在数组中搜索以查找匹配项(O(n) 时间复杂度),而将字符串作为键而不是值查找需要恒定的查找时间(O(1) 时间复杂度)。

标签: php if-statement shortcuts


【解决方案1】:

试试in_array

if (in_array($page, array('page1.php', 'page2.php', 'page3.php'))) { ... }

http://php.net/manual/en/function.in-array.php

【讨论】:

  • 也许我遗漏了最后一个括号作为读者练习。
  • 在这种情况下,完美! ;)
  • 我只是想为后代添加一个注释。 PHP 5.4+ 版有一个新的数组语法,所以它可以(稍微)更短。像这样:if (in_array($page, ['page1.php', 'page2.php', 'page3.php'])) { ... }
【解决方案2】:

使用switch,比复杂的if 条件更具可读性

switch ($page){
  case 'page1.php':
  case 'page2.php':
  case 'page3.php':
  case 'page4.php':
    // do something
    break;

  default:
    //else
}

【讨论】:

  • 更好...但仍然有点冗长。我想尽量不要多次重复任何命令。
  • 我认为任何其他选项都比 if 或 switch 语句效率低。
【解决方案3】:

要得到一个不一样的答案:

if (preg_match('"^page[1-4]\.php$"', $page)) {

现在这对于您的合成示例是有意义的,并且如果您确实有要测试的东西的范围,或者要使用其他一些结构。大多数情况下,它只是碰巧更紧凑。

【讨论】:

  • 如果您甚至没有对假设的示例进行分析,请不要用微优化猜想来困扰我。
【解决方案4】:

我认为一种可能的解决方案是编写函数,将 page1.php、page2.php 等作为参数,如果语句正确则返回 true。

【讨论】:

    【解决方案5】:

    更新

    对不起,脑死答案..错过了第一行。如上所述,您可以构建一个页面数组和用户 in_array()

    $pagelist = array('page1.php','page2.php','page3.php','page4.php','page5.php')
    if (in_array($page,$pagelist)) {
        //do something
    }
    

    它更优雅一些,并且明确地清理了 if 语句,但对减少代码没有太大作用。我能想到的唯一好处是您可以从外部源构建 $pagelist 数组并使用它可能更有效?

    【讨论】:

    • 你确实意识到他已经在他的帖子顶部有那个确切的代码 - 这就是他试图避免的!
    • 这和我的问题有什么不同?
    猜你喜欢
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多