检查变量是否不等于多个字符串值的更简单方法


Simpler way to check if variable is not equal to multiple string values?

当前代码:

<?php
  // See the AND operator; How do I simplify/shorten this line?
  if( $some_variable !== 'uk' && $some_variable !== 'in' ) {
    // Do something
  }
?>

和:

<?php
  // See the OR operator; How do I simplify/shorten this line?
  if( $some_variable !== 'uk' || $some_variable !== 'in' ) {
    // Do something else
  }
?>

有没有更简单(即更短)的方法来编写这两个条件?

注意:是的,它们是不同的,我期待不同的方法来缩短代码。

对于您的第一个代码,您可以使用由 使用in_array()@ShankarDamodaran:

if ( !in_array($some_variable, array('uk','in'), true ) ) {

甚至更短,自 PHP 5.4 以来可用的符号[]正如@Forty在评论中指出的那样

if ( !in_array($some_variable, ['uk','in'], true ) ) {

与以下相同:

if ( $some_variable !== 'uk' && $some_variable !== 'in' ) {

。但更短。特别是如果你比较的不仅仅是"uk"和"in"。我没有使用额外的变量(Shankar 使用了$os),而是在 if 语句中定义了数组。有些人可能会觉得很脏,我觉得它又快又整齐:D

您的第二个代码的问题在于它可以很容易地与 TRUE 交换,因为:

if (true) {

等于

if ( $some_variable !== 'uk' || $some_variable !== 'in' ) {

您正在询问字符串的值是不是 A 还是不是 B。如果是A,它肯定不是B,如果是B,它绝对不是A。如果它是 C 或其他任何东西,它也不是 A 也不是 B。所以这个陈述总是(这里不考虑薛定谔定律)返回 true。

你可以在 PHP 中使用in_array()

$os = array("uk", "us"); // You can set multiple check conditions here
if (in_array("uk", $os)) //Founds a match !
{
    echo "Got you"; 
}

我喜欢 Habchi 在评论中使用的代码

if(!($some_variable === 'uk' || $another_variable === 'in')){//do}

一个可能有意义的替代方法,特别是如果此测试被多次进行并且您正在运行 PHP 7+ 并安装了 Set 类是:

use Ds'Set;
$strings = new Set(['uk', 'in']);    
if (!$strings->contains($some_variable)) {

或者在任何版本的 PHP 上,您可以使用关联数组来模拟集合:

$strings = ['uk' => 1, 'in' => 1];
if (!isset($strings[$some_variable])) {

创建集合有额外的开销,但每个测试随后都变成了 O(1) 操作。当然,要比较的字符串列表越长,节省就越大。

如果你打算在 if 语句中构建一个函数,我也建议使用 in_array。干净多了。

如果您尝试为变量赋值,则可以使用 if/else 速记:

$variable_to_fill = $some_variable !== 'uk' ? false : true;

您需要多值检查。尝试使用以下代码:

<?php
    $illstack=array(...............);
    $val=array('uk','bn','in');
    if(count(array_intersect($illstack,$val))===count($val)){ // all of $val is in $illstack}
?>
您可能会

发现反转逻辑并使用带有空 if 的 else 语句更具可读性。

if($some_variable === 'uk' || $another_variable === 'in'){}
else {
    // This occurs when neither of the above are true
}

一些基本的正则表达式可以很好地解决问题$some_variable !== 'uk' && $some_variable !== 'in':

if(!preg_match('/^uk|in$/', $some_variable)) {
    // Do something
}