【问题标题】:Alternative to in_array or multiple OR in if-statement替代 in_array 或 if 语句中的多个 OR
【发布时间】:2012-08-20 05:06:33
【问题描述】:

所以,正如标题所说...任何替代方案:

$valid_times = array('ever', 'today', 'week', 'month');
if (($this->_time == 'ever') OR ($this->_time == 'day'))

if (in_array($this->_time, $valid_times))

??

注意:我知道上面提到的方法有效,但我只是在寻找新的东西来学习和试验

更新

感谢您提供信息,但我没有提到 switch() 作为替代方案,因为我的代码并非如此。它必须是一个 if 语句,我想知道是否存在类似:

if($this->_time == (('ever') OR ('day') OR ('month')))

你怎么看?如果上面提到,那将是第一种方式的较短方式

【问题讨论】:

  • 第二个是否可以替代第一个取决于$valid_times的内容。
  • 这完全取决于你想要做什么。
  • 鉴于更新的问题,我已经重写了我的答案。

标签: php optimization if-statement


【解决方案1】:

怎么样?

$a1 = array("one","two","three");
$found = "two";
$notFound = "four";

if (count(array_diff($a1,array($found))) != count($a1))
/* Found */

你可以使用

$found = array("one","three");

if (count(array_diff($a1,$found)) != count($a1));
/* Either one OR three */

http://codepad.org/FvXueJkE

【讨论】:

  • 有趣的方法,你只是给了我一个解决其他问题的想法+1
  • 我也对这个问题很好奇,这个解决方案看起来也很有趣.. 但现在我很好奇它有什么优势,即使它的执行速度快了 0.0001 秒之类的。
【解决方案2】:

我能想到的唯一选择是使用正则表达式。

$valid_times = array('ever','day','week','hour');

if(preg_match('/' . implode('|', $valid_times) . '/i', $this->_time)){
    // match found
} else {
    // match not found
}

【讨论】:

  • 好吧,好吧..它可以工作并回答问题,但我希望找到更有效的东西,而不是使其实际上不太有效的正则表达式:P(至少我认为它是)也许这个解决方案在其他一些情况下会有所帮助
【解决方案3】:

[编辑] 删除了原始答案,因为您现在指定不想使用 switch

在您更新的问题中,您询问了这样的事情是否可行:

if($this->_time == (('ever') OR ('day') OR ('month')))

直接的答案是“不,不在 PHP 中”。最接近的是in_array(),数组值位于同一行代码中:

if(in_array($this->_time, array('ever','day','month'))

PHP 5.4 的更新允许更短的数组语法,这意味着您可以删除单词 array,这使其更具可读性:

if(in_array($this->_time, ['ever','day','month'])

但这仍然是一个in_array() 电话。你无法解决这个问题。

【讨论】:

    【解决方案4】:

    in_array 有时会这样?

    $arr = array(1, 2, 'test');
    $myVar = 2;
    
    function my_in_array($val, $arr){
        foreach($arr as $arrVal){
            if($arrVal == $val){
                return true;
            }
        }
        return false;
    }
    
    if(my_in_array($myVar, $arr)){
        echo 'Found!';
    }
    

    【讨论】:

    • 这几乎不是一个选择;那只是重写现有的内置函数。
    • @SDC 他说他只是想尝试一下。据我们所知,可能是一项硬件任务,以编写您自己的 PHP 函数版本。
    【解决方案5】:

    令人费解,但它是另一种选择

    $input = 'day';
    $validValues = array('ever','day');
    $result = array_reduce($validValues,
                           function($retVal,$testValue) use($input) {
                               return $retVal || ($testValue == $input);
                           },
                           FALSE
                          );
    var_dump($result);
    

    【讨论】:

      【解决方案6】:

      你也可以使用 switch 语句。

      switch ($this->_time) {
        case 'ever':
        case 'day':
          //code
          break;
        default:
          //something else
      }
      

      【讨论】:

        【解决方案7】:

        为了科学,事实证明您可以在三元运算符中使用yield,因此您可以将一些复杂的评估放入匿名生成器中,并让它在第一个评估为真的情况下产生,而无需评估它们:

        $time = 'today';
        if( (function()use($time){
            $time == 'ever' ? yield true:null;
            $time == 'today' ? yield true:null;
            $time == 't'.'o'.'d'.'a'.'y' ? yield true:null;
        })()->current() ){
            echo 'valid';
        }
        

        在这种情况下,它将回显'valid',而无需评估串联。

        【讨论】:

          猜你喜欢
          • 2016-11-24
          • 2014-08-13
          • 1970-01-01
          • 2013-08-08
          • 2017-12-12
          • 2015-05-16
          • 2012-10-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多