Php 如何检查三个变量中是否只有一个不是空的?

Php 如何检查三个变量中是否只有一个不是空的?,php,if-statement,conditional-statements,var,Php,If Statement,Conditional Statements,Var,我有三个变量: $var1 $var2 $var3 实际上,我正在寻找最好的方法来检查这三个变量中是否只有一个不为空,另外两个是否为空 如果只使用一个,是否可以这样做?如果没有,那么最好的方法是什么 变量都包含文本 $counter=0; $counter+= empty($var1) ? 0:1; $counter+= empty($var2) ? 0:1; $counter+= empty($var3) ? 0:1; if($counter==1) echo "Exactly 2

我有三个变量:

$var1
$var2
$var3
实际上,我正在寻找最好的方法来检查这三个变量中是否只有一个不为空,另外两个是否为空

如果只使用一个
,是否可以这样做?如果没有,那么最好的方法是什么

变量都包含文本

$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\u filter()
将变量转换为数组并排除空变量。然后在过滤器后使用
count()

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

用数组_sum()检查布尔返回0和1

预计到达时间: 这是一种更简单的方法:

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'; }
如果您确实需要检查零或空字符串。这段代码的主要原理是,如果您添加更多的值,逻辑本身就不需要更改。

为此,我将使用
XOR
(),因为它是用于此目的的,所以对数组使用脏的变通方法并不容易理解

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
$before=微时间(true);
对于($i=0;$i<100000;++$i){
$var1='Hello';
$var2='';
$var3='';
如果(!(!empty($var1)&&&!empty($var2)&&!empty($var3))&&(!empty($var1)^!empty($var2)^!empty($var3))){
echo“只有一个字符串不是空的\n”;
}
$var4='';
$var5='';
$var6='';
如果(!(!empty($var4)&&&!empty($var5)&&!empty($var6))&(!empty($var4)^!empty($var5)^!empty($var6))){
echo“只有一个字符串不是空的\n”;
}
$var7='Hello';
$var8=‘世界’;
$var9=“!”;
如果(!(!empty($var7)&&&!empty($var8)&&!empty($var9))&(!empty($var7)^!empty($var8)^!empty($var9))){
echo“只有一个字符串不是空的\n”;
}
}
$after=微时间(真);
回声($after-$before)/$i。“用于XOR的秒\n”;
//XOR为3.2943892478943E-6秒
$before=微时间(真);
对于($i=0;$i<100000;++$i){
$var1='Hello';
$var2='';
$var3='';
if(计数(数组过滤器(数组($var1,$var2,$var3))==1){
echo“只有一个字符串不是空的\n”;
}
$var4='';
$var5='';
$var6='';
if(计数(数组过滤器(数组($var4,$var5,$var6))==1){
echo“只有一个字符串不是空的\n”;
}
$var7='Hello';
$var8=‘世界’;
$var9='';
if(计数(数组过滤器(数组($var7,$var8,$var9))==1){
echo“只有一个字符串不是空的\n”;
}
}
$after=微时间(真);
回声($after-$before)/$i。“用于阵列的秒\n”;
//阵列的4.30785894392E-6秒

*我不得不更新答案,因为“排他或”这个名字在两个以上的表达中有些误导。当然,所有的注释都是正确的,并且异或是一个二进制操作,因此从左到右解析
1^1^1==1
解析为
0^1==1
,因此为
true
。Exclusive or实际上查找奇数个trues


我用一个易于阅读的解决方法更新了我的答案,但这肯定不能让我满意,我必须告诉管理员,我解决了我头脑中对布尔运算符的一个巨大误解。上一次是错误的假设,
从左到右解析,而不是先
,然后
*

按位异或非常适合:

$var1 ^ $var2 ^ $var3
如果变量不容易转换为布尔值,您可能会遇到问题,在这种情况下,您需要对每个变量执行
empty($var)

轰。零
if
s

更新

哦,如果它们都不是空的,则为true^true^true==true

您需要检查它们是否都是真的:

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


你的意思是“正好1是空的”不,我的意思是正好2是空的empty@cetipabo如果您正在使用此选项,是否应该将其标记为答案?首先需要
trim
all
var
`$var1=trim($var1)$var2=修剪($var2)$var3=修剪($var3);`然后检查它。你能告诉我们变量的数据类型吗?数据类型是文本。我已经回答了这个问题。我想我的答案中的其他部分应该适合你。HNQ(热门网络问题)中的一个PHP问题?多么美好的时光啊!:-)您说//只有1个变量是空的。但我只想要一个不是空的。:)使用
compact
[$var1,$var2,$var3]
相同的结果似乎对我不起作用……我写道:if(计数(数组过滤器(compact($var1,$var2,$var3))==1){有什么问题吗?@cske:非常感谢!!@cetipabo,如果你喜欢这个答案,请标记为正确。OP有3个变量,只有1个允许为空。你的答案就像你有3个变量,其中2个允许为空。这确实意味着它是不正确的,你可以有3个空值,它仍然会返回true。我猜OP编辑了这个在后面的问题中,它在初始阶段似乎是不正确的。因为有更多类似于我的答案。@cetipabo它没有做同样的事情3次。它实际上检查了3件不同的事情。它检查var1是唯一的非空变量,或者var2是唯一的非空变量,或者VAR3是唯一的非空变量。所以他的答案是正确的。这可能是检查只有一个变量是非空的最直接的方法。如果你使用
!=
操作符进行非空测试,你不应该使用
=
进行空测试吗?我认为
是空的(…)
如果变量可以是字符串或数组,可能会更安全。OP有3个变量,只有1个允许为空。您的答案就像您有3个变量,其中2个允许为空。如果
($var1 ^ $var2 ^ $var3) && !($var1 && $var2 && $var3)