【问题标题】:Boolean value switch/invert布尔值切换/反转
【发布时间】:2011-06-03 23:11:52
【问题描述】:

PHP中是否有切换/反转boolean值的功能?

喜欢...的快捷方式:

if($boolean === true){
    $boolean = false;
}else{
    $boolean = true;
}

【问题讨论】:

标签: php boolean


【解决方案1】:

是的:

$boolean = !$boolean;

如果不是布尔值,可以使用三元构造:

$int = ($some_condition ? 1 : 2); // if $some_condition is true, set 1
                                  // otherwise set 2

【讨论】:

  • $bool = !$bool 会将 true 变为 false,但会将 false 变为 true我>?
  • 这段代码非常好。它是如此简单,我永远不会想到它!
  • 有没有办法用第三个选项来做那种代码?
  • @Richard 你在找什么样的方式?它应该做什么/不做什么?
  • 我在追求一些有点像三元的代码,但现在想起来,我知道我追求的是不可能的我不知道为什么我昨天没有意识到,我认为我读错了。
【解决方案2】:

使用绝对值函数abs() 怎么样,$val 可以是“1”或“0”并且你想反转它:

$val = abs($val-=1);

逻辑:

总是从数字中减去“1”并消除“符号”。

1 - 1 = 0
abs(0) = 0

0 - 1 = -1
abs(-1) = 1

【讨论】:

    【解决方案3】:

    如果您想要尽可能短的代码,请将布尔值与 1 进行异或:

    $boolean ^= 1;
    

    严格来说,这将返回一个 int 而不是布尔值。它的工作方式与$boolean = !$boolean 不同(效率略低),但在大多数情况下它应该可以完成这项工作。

    【讨论】:

    • 我做了 100 万次迭代,XOR 用了 0.25 秒,而逻辑否定用了 0.28 秒。因此,虽然它的工作方式不同,但它可能更有效。
    • PHP8 :这会将布尔值转换为 int!我的 phpunit 测试都因为这个而坏了
    【解决方案4】:

    只需使用! 来反转结果,这样就可以: $boolean = !(bool)$result;

    【讨论】:

      【解决方案5】:

      我比较了所有列出的方式,甚至是有趣的方式,以检查哪种方式更快,其中包括一个$bool = $bool!=true;:

      $max=1000000;
      $bool=true;
      
      for($t=-microtime(true),$i=0;$i<$max;++$i){
          if($bool) $bool=false; else $bool=true;
      }//Time 0.3589
      echo sprintf("Time %.4F\n",$t+microtime(true));
      
      for($t=-microtime(true),$i=0;$i<$max;++$i){
          switch($bool){ case true: $bool=false; break; default: $bool=true;}
      }//Time 0.4387
      echo sprintf("Time %.4F\n",$t+microtime(true));
      
      for($t=-microtime(true),$i=0;$i<$max;++$i){
          $bool = !$bool;
      }//Time 0.2833
      echo sprintf("Time %.4F\n",$t+microtime(true));
      
      for($t=-microtime(true),$i=0;$i<$max;++$i){
          $bool = $bool!=true;
      }//Time 0.2803
      echo sprintf("Time %.4F\n",$t+microtime(true));Time 0.2803
      
      for($t=-microtime(true),$i=0;$i<$max;++$i){
          $bool = ($bool-1)*(-1);
      }//Time 0.3047
      echo sprintf("Time %.4F\n",$t+microtime(true));
      
      for($t=-microtime(true),$i=0;$i<$max;++$i){
          $bool = abs($bool-1);
      }//Time 1.2211
      echo sprintf("Time %.4F\n",$t+microtime(true));
      
      for($t=-microtime(true),$i=0;$i<$max;++$i){
          $bool ^= 1; //XOR
      }//Time 0.2595
      echo sprintf("Time %.4F\n",$t+microtime(true));
      
      for($t=-microtime(true),$i=0;$i<$max;++$i){
          $bool = $bool?0:1;
      }//Time 0.3253
      echo sprintf("Time %.4F\n",$t+microtime(true));
      

      奇怪的是,明显的表现似乎是第三名。 XOR 比逻辑补码(negation)要快一点,而且这最后似乎和不相等差不多em> 我添加到聚会中的运算符。

      交换值的时间为 1 百万次:

      1. $bool ^= 1 -> 0.2595 秒
      2. $bool = $bool!=true -> 0.2803 秒
      3. $bool = !$bool -> 0.2833 秒
      4. $bool = ($bool-1)*(-1) -> 0.3047 秒
      5. $bool = $bool?0:1 -> 0.3253 秒
      6. 如果 -> 0.3589 秒
      7. 切换 -> 0.4387 秒
      8. $bool = abs($bool-1) -> 1.2211 秒

      【讨论】:

        【解决方案6】:

        一键选择布尔值:

        $detector = !$picker = $detector;

        【讨论】:

          【解决方案7】:

          你可以在一行中完成:

          <?php
          $val = 0 
          $val = $val ==1?0:1;  
          ?>
          

          【讨论】:

          • 假设那些$val 值,你可以做$val = $val?0:1;
          【解决方案8】:

          bool 可以是 TRUE 或 FALSE。

          用法:(boolean)$red = varbool(false);
          回声$红色;

          如果为真,它将返回零,如果为假,则返回一

          function varbool($val){ 
          
              $val +=(-1);
              $val *= (-1);   
              return $val;
          }
          

          【讨论】:

          • 只有一个问题...为什么? ! 有什么问题? (我很想-0.5 重新发明轮子,-0.5 做得很差)
          • 如果您有三个名字,则优雅是名字之后和姓氏之前的名字。
          • 这个答案应该被存档。具有历史价值。
          • 我没有看到历史价值,因为它从未回答过这个问题。
          • @SteveBuzonas 历史价值在于它非常有趣。
          猜你喜欢
          • 1970-01-01
          • 2021-09-02
          • 2017-09-27
          • 2021-02-24
          • 2012-07-21
          • 1970-01-01
          • 2018-05-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多