web-dev-qa-db-ja.com

3つの変数のうち1つだけが空でないかどうかを確認するにはどうすればよいですか?

私には3つの変数があります:

$var1
$var2
$var3

私は実際に、これら3つの変数のうち1つだけが空ではなく、他の2つが空であるかどうかを確認するための最良の方法を探しています。

1つのifだけでこれを行うことは可能ですか?そうでない場合、最善の方法は何ですか?

変数にはすべてテキストが含まれています。

20
cetipabo

array_filter()を使用して、変数を配列に変換し、空の変数を除外できます。次に、フィルターの後にcount()を使用します。

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

チェック フィドルリンク

35
Haresh Vidja

ブール値は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" ;
}
25
Dominique Lorre
$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);

フィドル

10
Hanky Panky

これには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

*「排他的論理和」という名前は、3つ以上の式のコンテキストで多少誤解を招くため、回答を更新する必要がありました。もちろん、すべてのコメント投稿者は正しく、排他的論理和であるため、左から右に解決されます。 1 ^ 1 ^ 1 == 10 ^ 1 == 1に解決されるため、trueになります。排他的論理和または実際には奇数の真を探します。

読みやすい回避策で回答を更新しましたが、これでは間違いなく満足できず、ブール演算子の大きな誤解を頭の中で解決したことを管理する必要があります。前回は、最初にAND、次にOR。*ではなく、ANDORが左から右に解決されるという誤った仮定でした。

7
Fabio Poloni

これを試してください:

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

ビット単位XORはこれに最適です:

_$var1 ^ $var2 ^ $var3
_

変数がブール値に簡単にキャストされない場合、可能性があります。その場合、empty($var)を実行する必要があります。それらのそれぞれ。

ブーム。ゼロifs。

更新

おっと、それらがall空でない場合、true ^ true ^ true == true

それらすべてが真であるかどうかを確認する必要があります。

_($var1 ^ $var2 ^ $var3) && !($var1 && $var2 && $var3)
_
3
Mirror318

これは、配列を使用する必要がある状況です。現在、値は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'; }

ゼロまたは空の文字列をチェックする必要がある場合 他の方法を使用してカウントできます 。このコードの主な原則は、値を追加してもロジック自体を変更する必要がないということです。

2
Martijn

これを試して:

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

[〜#〜]デモ[〜#〜]

0
Dave