如何检查三个变量中只有一个不为空?

时间:2016-09-14 07:18:10

标签: php if-statement conditional-statements var

我有三个变量:

$var1
$var2
$var3

我实际上正在寻找检查这三个变量中只有一个是否为空并且另外两个为空的最佳方法。

仅使用一个if可以做到这一点吗?如果没有,那么最好的方法是什么?

变量都包含文本。

8 个答案:

答案 0 :(得分:35)

您可以使用array_filter()将变量转换为数组并排除空变量。然后在过滤器后使用count()

if(count(array_filter(array($var1,$var2,$var3)))==1){
  //only 1 variable is not empty
}

检查Fiddle link

答案 1 :(得分:25)

布尔值使用array_sum()

返回0和1
if (array_sum(array(empty($var1), empty($var2), empty($var3))) == 1)
{
    echo "one is empty" ;
}

ETA: 这是一种更简单的方法:

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" ;
}

答案 2 :(得分:10)

$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";

<强> Fiddle

或者你可以简单地做

var_dump(count(array_filter(array($var1,$var2,$var3)))==1);

<强> Fiddle

答案 3 :(得分:7)

我会使用XORexclusive 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。独家或实际上寻找奇数的真实。

我用一个易于阅读的解决方法更新了我的答案,但这绝对不能满足我,我必须管理员,我在脑海中解决了对布尔运算符的巨大误解。最后一次是错误的假设,ANDOR从左到右解决,而不是先AND然后OR。*

答案 4 :(得分:4)

试试这个:

if (($var1 !== '' && $var2 == '' && $var3 == '') ||
    ($var2 !== '' && $var1 == '' && $var3 == '')  ||
    ($var3 !== '' && $var1 == '' && $var2 == '')) {
    echo 'variable is empty';
}

答案 5 :(得分:3)

Bitwise XOR非常适合:

$var1 ^ $var2 ^ $var3

如果变量不容易转换为布尔值,那么可能会遇到麻烦,在这种情况下,您需要对每个变量执行empty($var)

动臂。零if s。

<强>更新

哎呀,如果他们所有都不是空的,那么真的是^ true ^ true == true

您需要检查所有这些是否属实:

($var1 ^ $var2 ^ $var3) && !($var1 && $var2 && $var3)

答案 6 :(得分:2)

这是您应该使用数组的情况。你现在只有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。此代码的主要原则是,如果添加更多值,逻辑本身不需要更改。

答案 7 :(得分:0)

试试这个:

$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;
}

<强> DEMO