【问题标题】:How can I check whether only one out of three variables is not empty?如何检查三个变量中是否只有一个不为空?
【发布时间】:2017-01-21 21:57:33
【问题描述】:

我有三个变量:

$var1
$var2
$var3

我实际上正在寻找检查这三个变量中只有一个是否不为空以及其他两个是否为空的最佳方法。

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

变量都包含文本。

【问题讨论】:

  • 首先需要trim所有var`$var1 = trim($var1); $var2 = 修剪($var2); $var3 = trim($var3);` 然后检查一下。
  • 能否告诉我们变量的数据类型是什么?
  • 数据类型是文本。
  • 我已经回答了这个问题。我想我的答案中的其他部分应该对你有用。
  • HNQ(热点网络问题)中的 PHP 问题?什么时候活着! :-)

标签: php if-statement conditional-statements var


【解决方案1】:

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

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

查看Fiddle link

【讨论】:

  • 你说 //只有 1 个变量是空的。但我只想要一个不是空的。 :)
  • 反对使用compact , [$var1,$var2,$var3] 相同的结果
  • 似乎对我不起作用....我写道: if(count(array_filter(compact($var1,$var2,$var3)))==1){ 有什么问题?
  • @cske : 非常感谢!!
  • @cetipabo,如果您喜欢这个答案,请标记为正确。
【解决方案2】:

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

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

【讨论】:

  • 如果你想 100% 确定它是一个整数而不强制转换每个变量,请像这样使用:(0 + empty($var1) + empty($var2) + ...)
  • @DanFromGermany 0 + 不是必需的,因为您不添加变量,而是来自函数调用 empty() 的结果,即 01
  • @DominiqueLorre empty() 的结果是 truefalse,而不是 1 或 0。boolean 在算术运算中计算为 integer 但这并不是理所当然的 100%每个版本中的所有情况。我知道没有必要。我想说的是,这是一个显式cast的方法。就像0.0 + integer 将转换为0.0 + (float)integer 并最终评估为float
  • @DanFromGermany,在这种情况下,我认为 Hanky Panky 的回答更好。如果为真,他使用 0,如果为假,他使用 1,所以这是颠倒的,但结果是相同的,你不施放任何东西。他只使用整数。
【解决方案3】:
$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

【讨论】:

  • 你的意思是“正好 1 是空的”
  • 不,我的意思是正好 2 是空的
  • @cetipabo 如果你正在使用这个,不应该将其标记为答案吗?
【解决方案4】:

我会为此使用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

*我不得不更新答案,因为“异或”这个名称在两个以上表达式的上下文中有些误导。当然,所有评论者都是正确的,并且排他性 or 是二元运算,因此从左到右解析。 1 ^ 1 ^ 1 == 1 解析为 0 ^ 1 == 1,因此是 true。独占或确实寻找奇数个真值。

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

【讨论】:

  • 奇怪,xor 还有另一个答案,但它消失了。哦,好吧,你得到了 +1
  • 我偷偷黑掉了 SO 删除它,这样我就可以赢得所有的声誉。请不要告诉任何人。这是我们的小秘密。
  • @FabioPoloni:尝试使用三个非空变量。 1 ^ 1 ^ 1 == 1
  • 你当然没事。而这大概就是第一个帖子使用独占或者消失的原因吧。
  • 原来的 XOR 答案是我的,我删除了它,因为它根本不起作用,因为 true ^ true ^ true 将导致 true 由于 true &amp; truefalsefalse ^ true 是真的,保持一个给出错误结果的答案毫无意义,并认为我一直在投票,我删除了它,我不想传播虚假信息:)
【解决方案5】:

试试这个:

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

【讨论】:

  • OP有3个变量,只允许1个为空。您的回答就像您有 3 个变量,其中 2 个允许为空。
  • 这确实意味着它不正确,你可以有 3 个空值并且它仍然会返回 true
  • 我猜OP后来编辑了这个问题,它似乎在初始阶段是不正确的。因为有更多类似我的答案。
  • @cetipabo 3 次没有做同样的事情。它实际上是在检查 3 个不同的东西。它正在检查 var1 是否是唯一的非空变量,或者 var2 是唯一的非空变量,或者 var 3 是唯一的非空变量。所以这个答案是正确的。这可能是检查只有一个变量是否为非空的最直接的方法。
  • 如果您使用!== 运算符进行非空测试,您不应该使用=== 进行空测试吗?我认为如果变量可以是字符串或数组,empty(...) 可能会更安全。
【解决方案6】:

按位异或非常适合:

$var1 ^ $var2 ^ $var3

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

轰隆隆。零ifs。

更新

糟糕,如果它们全部不为空,则为 true ^ true ^ true == true

您需要检查所有这些是否正确:

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

【讨论】:

    【解决方案7】:

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

    【讨论】:

    • 哈哈,其他方法的链接里的答案。修复它,那nks
    【解决方案8】:

    试试这个:

    $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

    【讨论】:

    • OP有3个变量,只允许1个为空。您的回答就像您有 3 个变量,其中 2 个允许为空。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多