【问题标题】:Simpler way to check if variable is not equal to multiple string values?检查变量是否不等于多个字符串值的更简单方法?
【发布时间】:2023-04-09 07:10:01
【问题描述】:

当前代码:

<?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

  }

?>

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

注意:是的,它们是不同的,我希望有不同的方法来缩短代码。

【问题讨论】:

  • 您只删除了括号。请编辑您的示例代码以反映您的实际要求。
  • @CBroe 看到注释了吗?如果还不清楚,请告诉我。
  • 关于“请编辑您的示例代码以反映您实际要求的内容”的不清楚之处
  • @CBroe 在底部添加注释没有意义,我没有。更清楚地说,我已经进行了您建议的编辑。 编辑: 还注意到代码中的另一个错误,我已修复。
  • @CBroe 是正确的 - 第二个条件始终为 TRUE。但是对第一个的小修正:在示例中有 usde '!==',所以应该传递 TRUE 作为 in_array 的第三个参数。 !in_array($some_variable, array('uk', 'in'), true)

标签: php if-statement conditional-statements


【解决方案1】:

您可以在 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"; 
}

【讨论】:

  • 这两个代码中的哪一个简化了? (请参阅编辑后的问题)
  • @CBroe 这是我做的第一件事。目前还不清楚(对我来说)in_array()&amp;&amp; 还是 ||
  • “如果在数组中找到 needle,则返回 TRUE,否则返回 FALSE。”
  • 在上面的例子中,uk 是指针,它与数组中的所有元素进行比较。由于uk 存在.. 找到匹配项。
  • 与接受的答案相同,您应该在 in_array() 检查中使用严格比较来复制 OP 的 if 语句
【解决方案2】:

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

如果您尝试为变量赋值,您可以使用 if/else 简写:

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

【讨论】:

    【解决方案3】:

    对于您的第一个代码,您可以使用 the answer given by @ShankarDamodaran 的简短更改,使用 in_array()

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

    [] 符号自 php 5.4 起可用,甚至更短,正如 cmets 中 @Forty 所指出的那样

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

    等同于:

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

    ...但更短。特别是如果您比较的不仅仅是“英国”和“英国”。 我不使用附加变量(Shankar used $os),而是在 if 语句中定义数组。有些人可能会觉得很脏,我觉得它又快又整洁:D

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

    if (true) {
    

    等于

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

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

    【讨论】:

    • 要使您的第一个答案相同,您需要将 third paramter of in_array() 设置为 true 以使用严格比较。
    • 您缺少 in_array 调用的右括号。
    • 薛定谔参考 +1。
    • 从 php 5.4 开始,您也可以只使用简写 [] 而不是 array()
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 不要。采用。正则表达式。为了。一切。 ://
      【解决方案6】:

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

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

      【讨论】:

      • 有一个空子句条件不是很可读的代码。用一个 !在您的第一个 if 语句中,类似于 if( !($some_variable === 'uk' || $another_variable === 'in')){ //当以上都不是真的时会发生这种情况}。
      【解决方案7】:

      一个可能有意义的替代方案,特别是如果多次进行此测试并且您正在运行 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) 操作。当然,要比较的字符串列表越长,节省的费用就越多。

      【讨论】:

        【解决方案8】:

        我喜欢Habchi在cmets中使用的代码

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

        【讨论】:

          猜你喜欢
          • 2012-08-25
          • 2012-08-28
          • 2012-08-20
          • 2015-02-04
          • 2012-09-21
          • 2019-11-17
          • 1970-01-01
          • 2021-12-11
          相关资源
          最近更新 更多