如何检查三个变量中是否只有一个不为空?
How can I check whether only one out of three variables is not empty?
我有三个变量:
$var1
$var2
$var3
实际上我正在寻找检查这三个变量中 只有一个 是否为空以及 两个其他 是否为空的最佳方法是空的。
是否可以只用一个 if
来做到这一点?如果没有,那最好的方法是什么?
变量都包含文本。
$counter=0;
$counter+= empty($var1) ? 0:1;
$counter+= empty($var2) ? 0:1;
$counter+= empty($var3) ? 0:1;
if($counter==1)
echo "Exactly 2 are empty";
或者你可以简单地做
var_dump(count(array_filter(array($var1,$var2,$var3)))==1);
试试这个:
$temp_array = array($var1,$var2,$var3);
$temp_count = count(array_filter($temp_array, 'strlen'));
if($temp_count ==1){
echo "1 variable is not empty";
}
else
{
echo "total empty variable is = ".$temp_count;
}
试试这个:
if (($var1 !== '' && $var2 == '' && $var3 == '') ||
($var2 !== '' && $var1 == '' && $var3 == '') ||
($var3 !== '' && $var1 == '' && $var2 == '')) {
echo 'variable is empty';
}
您可以使用 array_filter()
将变量转换为数组并排除空变量。然后在过滤后使用count()
。
if(count(array_filter(array($var1,$var2,$var3)))==1){
//only 1 variable is not empty
}
布尔值 return 0 和 1 与 array_sum()
if (array_sum(array(empty($var1), empty($var2), empty($var3))) == 1)
{
echo "one is empty" ;
}
预计到达时间:
这是一个更简单的方法:
if (!empty($var1) + !empty($var2) + !empty($var3) == 1) {
echo "1 is not empty" ;
}
ETA 2:我们不需要负号
if (empty($var1) + empty($var2) + empty($var3) == 2) {
echo "1 is not empty" ;
}
在这种情况下你应该使用数组。您现在只有 3 个值,但是如果您需要 4 个怎么办?您需要更改所有代码!
$var = array();
$var[] = 'abc';
$var[] = '';
$var[] = 0;
// will return 1, empty values, false or 0 (falsy values) will not get counted:
echo count(array_filter($var)).' values found';
if( count(array_filter($var))==1 ){ echo 'exactly one value set'; }
如果您确实需要检查零或空字符串 you can use other methods to count。这段代码的主要原则是,如果你添加更多的值,逻辑本身不需要改变。
我会为此使用 XOR
(exclusive or),因为它就是为此目的而设计的,所以对数组使用肮脏的解决方法并不那么容易理解。
if (!(!empty($var1) && !empty($var2) && !empty($var3)) && (!empty($var1) ^ !empty($var2) ^ !empty($var3))) {
echo "Only one string is not empty\n";
}
而且它比接受的答案快大约 25%。
$before = microtime(true);
for ($i = 0; $i < 100000; ++$i) {
$var1 = 'Hello';
$var2 = '';
$var3 = '';
if (!(!empty($var1) && !empty($var2) && !empty($var3)) && (!empty($var1) ^ !empty($var2) ^ !empty($var3))) {
echo "Only one string is not empty\n";
}
$var4 = '';
$var5 = '';
$var6 = '';
if (!(!empty($var4) && !empty($var5) && !empty($var6)) && (!empty($var4) ^ !empty($var5) ^ !empty($var6))) {
echo "Only one string is not empty\n";
}
$var7 = 'Hello';
$var8 = 'World';
$var9 = '!';
if (!(!empty($var7) && !empty($var8) && !empty($var9)) && (!empty($var7) ^ !empty($var8) ^ !empty($var9))) {
echo "Only one string is not empty\n";
}
}
$after = microtime(true);
echo ($after-$before)/$i . " sec for XOR\n";
// 3.2943892478943E-6 sec for XOR
$before = microtime(true);
for ($i = 0; $i < 100000; ++$i) {
$var1 = 'Hello';
$var2 = '';
$var3 = '';
if (count(array_filter(array($var1, $var2, $var3))) == 1) {
echo "Only one string is not empty\n";
}
$var4 = '';
$var5 = '';
$var6 = '';
if (count(array_filter(array($var4, $var5, $var6))) == 1) {
echo "Only one string is not empty\n";
}
$var7 = 'Hello';
$var8 = 'World';
$var9 = '';
if (count(array_filter(array($var7, $var8, $var9))) == 1) {
echo "Only one string is not empty\n";
}
}
$after = microtime(true);
echo ($after-$before)/$i . " sec for Arrays\n";
// 4.3078589439392E-6 sec for Arrays
*我必须更新答案,因为名称 "exclusive or" 在超过两个表达式的上下文中有点误导。当然,所有评论者都是正确的,排他或是二元运算,因此从左到右解析。 1 ^ 1 ^ 1 == 1
解析为 0 ^ 1 == 1
,因此是 true
。异或实际上寻找奇数个真。
我用一个易于阅读的解决方法更新了我的答案,但这绝对不能让我满意,我不得不承认我解决了我脑海中对布尔运算符的一个巨大误解。上一次是错误的假设 AND
和 OR
从左到右解析而不是先 AND
然后 OR
.*
按位异或非常适合这个:
$var1 ^ $var2 ^ $var3
如果变量不能轻松转换为布尔值,您可能会遇到麻烦,在这种情况下,您需要对每个变量执行empty($var)
。
繁荣。零 if
秒。
更新
糟糕,如果它们全部不为空,true ^ true ^ true == true
您需要检查所有这些是否为真:
($var1 ^ $var2 ^ $var3) && !($var1 && $var2 && $var3)
我有三个变量:
$var1
$var2
$var3
实际上我正在寻找检查这三个变量中 只有一个 是否为空以及 两个其他 是否为空的最佳方法是空的。
是否可以只用一个 if
来做到这一点?如果没有,那最好的方法是什么?
变量都包含文本。
$counter=0;
$counter+= empty($var1) ? 0:1;
$counter+= empty($var2) ? 0:1;
$counter+= empty($var3) ? 0:1;
if($counter==1)
echo "Exactly 2 are empty";
或者你可以简单地做
var_dump(count(array_filter(array($var1,$var2,$var3)))==1);
试试这个:
$temp_array = array($var1,$var2,$var3);
$temp_count = count(array_filter($temp_array, 'strlen'));
if($temp_count ==1){
echo "1 variable is not empty";
}
else
{
echo "total empty variable is = ".$temp_count;
}
试试这个:
if (($var1 !== '' && $var2 == '' && $var3 == '') ||
($var2 !== '' && $var1 == '' && $var3 == '') ||
($var3 !== '' && $var1 == '' && $var2 == '')) {
echo 'variable is empty';
}
您可以使用 array_filter()
将变量转换为数组并排除空变量。然后在过滤后使用count()
。
if(count(array_filter(array($var1,$var2,$var3)))==1){
//only 1 variable is not empty
}
布尔值 return 0 和 1 与 array_sum()
if (array_sum(array(empty($var1), empty($var2), empty($var3))) == 1)
{
echo "one is empty" ;
}
预计到达时间: 这是一个更简单的方法:
if (!empty($var1) + !empty($var2) + !empty($var3) == 1) {
echo "1 is not empty" ;
}
ETA 2:我们不需要负号
if (empty($var1) + empty($var2) + empty($var3) == 2) {
echo "1 is not empty" ;
}
在这种情况下你应该使用数组。您现在只有 3 个值,但是如果您需要 4 个怎么办?您需要更改所有代码!
$var = array();
$var[] = 'abc';
$var[] = '';
$var[] = 0;
// will return 1, empty values, false or 0 (falsy values) will not get counted:
echo count(array_filter($var)).' values found';
if( count(array_filter($var))==1 ){ echo 'exactly one value set'; }
如果您确实需要检查零或空字符串 you can use other methods to count。这段代码的主要原则是,如果你添加更多的值,逻辑本身不需要改变。
我会为此使用 XOR
(exclusive or),因为它就是为此目的而设计的,所以对数组使用肮脏的解决方法并不那么容易理解。
if (!(!empty($var1) && !empty($var2) && !empty($var3)) && (!empty($var1) ^ !empty($var2) ^ !empty($var3))) {
echo "Only one string is not empty\n";
}
而且它比接受的答案快大约 25%。
$before = microtime(true);
for ($i = 0; $i < 100000; ++$i) {
$var1 = 'Hello';
$var2 = '';
$var3 = '';
if (!(!empty($var1) && !empty($var2) && !empty($var3)) && (!empty($var1) ^ !empty($var2) ^ !empty($var3))) {
echo "Only one string is not empty\n";
}
$var4 = '';
$var5 = '';
$var6 = '';
if (!(!empty($var4) && !empty($var5) && !empty($var6)) && (!empty($var4) ^ !empty($var5) ^ !empty($var6))) {
echo "Only one string is not empty\n";
}
$var7 = 'Hello';
$var8 = 'World';
$var9 = '!';
if (!(!empty($var7) && !empty($var8) && !empty($var9)) && (!empty($var7) ^ !empty($var8) ^ !empty($var9))) {
echo "Only one string is not empty\n";
}
}
$after = microtime(true);
echo ($after-$before)/$i . " sec for XOR\n";
// 3.2943892478943E-6 sec for XOR
$before = microtime(true);
for ($i = 0; $i < 100000; ++$i) {
$var1 = 'Hello';
$var2 = '';
$var3 = '';
if (count(array_filter(array($var1, $var2, $var3))) == 1) {
echo "Only one string is not empty\n";
}
$var4 = '';
$var5 = '';
$var6 = '';
if (count(array_filter(array($var4, $var5, $var6))) == 1) {
echo "Only one string is not empty\n";
}
$var7 = 'Hello';
$var8 = 'World';
$var9 = '';
if (count(array_filter(array($var7, $var8, $var9))) == 1) {
echo "Only one string is not empty\n";
}
}
$after = microtime(true);
echo ($after-$before)/$i . " sec for Arrays\n";
// 4.3078589439392E-6 sec for Arrays
*我必须更新答案,因为名称 "exclusive or" 在超过两个表达式的上下文中有点误导。当然,所有评论者都是正确的,排他或是二元运算,因此从左到右解析。 1 ^ 1 ^ 1 == 1
解析为 0 ^ 1 == 1
,因此是 true
。异或实际上寻找奇数个真。
我用一个易于阅读的解决方法更新了我的答案,但这绝对不能让我满意,我不得不承认我解决了我脑海中对布尔运算符的一个巨大误解。上一次是错误的假设 AND
和 OR
从左到右解析而不是先 AND
然后 OR
.*
按位异或非常适合这个:
$var1 ^ $var2 ^ $var3
如果变量不能轻松转换为布尔值,您可能会遇到麻烦,在这种情况下,您需要对每个变量执行empty($var)
。
繁荣。零 if
秒。
更新
糟糕,如果它们全部不为空,true ^ true ^ true == true
您需要检查所有这些是否为真:
($var1 ^ $var2 ^ $var3) && !($var1 && $var2 && $var3)