Php 布尔值开关/反转
PHP中是否有用于切换/反转Php 布尔值开关/反转,php,boolean,Php,Boolean,PHP中是否有用于切换/反转布尔值的函数 像。。。快捷方式: if($boolean === true){ $boolean = false; }else{ $boolean = true; } 是的: 如果不是布尔值,则可以使用三元结构: $int = ($some_condition ? 1 : 2); // if $some_condition is true, set 1 // otherwise se
布尔值的函数
像。。。快捷方式:
if($boolean === true){
$boolean = false;
}else{
$boolean = true;
}
是的:
如果不是布尔值,则可以使用三元结构:
$int = ($some_condition ? 1 : 2); // if $some_condition is true, set 1
// otherwise set 2
布尔可以是真的也可以是假的
用法:(布尔)$red=varbool(false)
回声$red
如果为true,则返回0,如果为false,则返回1
function varbool($val){
$val +=(-1);
$val *= (-1);
return $val;
}
一触式拾取布尔值:
$detector=$选择器=$检测器 使用绝对值函数abs()
,$val可以是“1”或“0”,您要反转它:
$val = abs($val-=1);
逻辑是:
始终从数字中减去“1”并删除“符号”
如果需要最短的代码,请将布尔值与1异或:
$boolean ^= 1;
严格地说,它返回的是int而不是boolean。它的工作方式与$boolean=不同$布尔值(效率稍低),但在大多数情况下,它应该可以完成这项工作。只需使用
以反转结果,使其类似于:
$boolean=!(bool)$结果 您可以在一行中完成:
<?php
$val = 0
$val = $val ==1?0:1;
?>
我比较了所有列出的方法,甚至是有趣的方法,以检查什么更快,包括一个更多的$bool=$bool=是的代码>:
$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));
$max=1000000;
$bool=true;
对于($t=-microtime(true),$i=0;$i 1.2211秒
$bool=!$bool
会变真为假,但它会变假为真吗?这段代码非常棒。它如此简单,我从来没有想到过!有没有第三种方法可以实现这种代码?@Richard你在寻找什么样的方法?它应该做什么/不应该做什么?我想要的代码有点像三元代码,但这是现在回想起来,我知道我所追求的是不可能的。我不知道为什么我昨天没有意识到,我想我读错了。只有一个问题……为什么?<代码>出了什么问题!代码>?(我很想重新发明方向盘,得到-0.5;做得如此糟糕,得到-0.5)如果你有三个名字,优雅是在你的名字之后,在你的姓之前。这个答案应该存档。它有历史价值。我看不出历史价值,因为它从来没有回答过这个问题。@SteveBuzonas历史价值来自于它是如此他妈的有趣。假设那些$val
值,你可以做 $val=$val?0:1;
我进行了100万次迭代,XOR耗时0.25秒,而逻辑求反耗时0.28秒。因此,尽管它的工作方式不同,但效率可能更高。
<?php
$val = 0
$val = $val ==1?0:1;
?>
$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));