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)
我会使用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.独家或实际上寻找奇数的真实.
我用一个易于阅读的解决方法更新了我的答案,但这绝对不能满足我,我必须管理员,我在脑海中解决了对布尔运算符的巨大误解.最后一次是从左到右的错误假设AND和OR解决,而不是AND从那时开始OR.*
| 归档时间: |
|
| 查看次数: |
3568 次 |
| 最近记录: |