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

cet*_*abo 20 php if-statement var conditional-statements

我有三个变量:

$var1
$var2
$var3
Run Code Online (Sandbox Code Playgroud)

我实际上正在寻找最好的方法来检查这三个变量中只有一个不是空的而另外两个是空的.

这可能if只用一个吗?如果没有,那么最好的方法是什么?

变量都包含文本.

Har*_*dja 35

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

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

检查小提琴链接


Dom*_*rre 25

布尔值使用array_sum()返回0和1

if (array_sum(array(empty($var1), empty($var2), empty($var3))) == 1)
{
    echo "one is empty" ;
}
Run Code Online (Sandbox Code Playgroud)

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

if (!empty($var1) + !empty($var2) + !empty($var3) == 1) {
    echo "1 is not empty" ;
}
Run Code Online (Sandbox Code Playgroud)

ETA 2:我们不需要负号

if (empty($var1) + empty($var2) + empty($var3) == 2) {
    echo "1 is not empty" ;
}
Run Code Online (Sandbox Code Playgroud)


Han*_*nky 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";
Run Code Online (Sandbox Code Playgroud)

小提琴

或者你可以干脆做

var_dump(count(array_filter(array($var1,$var2,$var3)))==1);
Run Code Online (Sandbox Code Playgroud)

小提琴

  • @cetipabo如果你使用这个,不应该标记为答案吗? (2认同)

Fab*_*oni 7

我会使用XOR(exclusive或),因为它是为此目的而设计的,因此使用带有数组的脏解决方法并不容易理解.

if (!(!empty($var1) && !empty($var2) && !empty($var3)) && (!empty($var1) ^ !empty($var2) ^ !empty($var3))) {
    echo "Only one string is not empty\n";
}
Run Code Online (Sandbox Code Playgroud)

它比接受的答案快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
Run Code Online (Sandbox Code Playgroud)

*我必须更新答案,因为名称"exclusive or"在两个以上表达式的上下文中有些误导.当然,所有评论者都是对的,并且是排他性的或者是二元操作,因此从左到右解析.1 ^ 1 ^ 1 == 1解决,0 ^ 1 == 1因此true.独家或实际上寻找奇数的真实.

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

  • @FabioPoloni:尝试使用三个非空变量.`1 ^ 1 ^ 1 == 1` (4认同)
  • 我秘密地攻击了SO以删除它,所以我可以获得所有的声誉.请不要告诉任何人.这是我们的小秘密. (3认同)
  • Downvoted,因为这不起作用. (2认同)
  • 当然你没事.这可能是第一篇文章使用独占或消失的原因. (2认同)
  • 原来的XOR答案是我的,我删除它因为它根本不起作用,因为`true ^ true ^ true`将导致'true`,因为`true&true`是`false`和`false ^ true`是真的,没有必要保持一个给出错误结果的答案,并采取了我不断得到upvotes我删除它,我不想传播虚假信息:) (2认同)