0

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

$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')))

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

4

7 回答 7

2

关于什么 ?

$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

于 2012-08-24T16:05:35.223 回答
2

[编辑] 删除原始答案,因为您现在已指定不想使用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()电话。你无法解决这个问题。

于 2012-08-24T15:56:49.240 回答
2

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

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

if(preg_match('/' . implode('|', $valid_times) . '/i', $this->_time)){
    // match found
} else {
    // match not found
}
于 2012-08-24T15:57:31.640 回答
1

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

$input = 'day';
$validValues = array('ever','day');
$result = array_reduce($validValues,
                       function($retVal,$testValue) use($input) {
                           return $retVal || ($testValue == $input);
                       },
                       FALSE
                      );
var_dump($result);
于 2012-08-24T16:17:16.770 回答
1

有时像 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!';
}
于 2012-08-24T15:56:17.377 回答
0

您也可以使用 switch 语句。

switch ($this->_time) {
  case 'ever':
  case 'day':
    //code
    break;
  default:
    //something else
}
于 2012-08-24T15:56:24.967 回答
0

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

$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'不评估连接的情况下回显。

于 2020-01-22T20:46:12.217 回答