2016-09-14 2 views
20

У меня есть три переменные:Как проверить, не пусто ли только одна из трех переменных?

$var1 
$var2 
$var3 

Я на самом деле ищу лучший способ проверить, если только один из этих трех переменных не является пустым и две других пусты.

Возможно ли это сделать только с одним номером if? Если нет, то какой лучший способ?

Все переменные содержат текст.

+0

Сначала нужно «подрезать» все 'var' '$ var1 = trim ($ var1); $ var2 = trim ($ var2); $ var3 = trim ($ var3); ' затем проверьте его. – koe

+0

Можете ли вы сообщить нам, что такое тип данных переменной? – SanketR

+0

datatype - это текст. – cetipabo

ответ

31

Вы можете преобразовать переменную в массив и исключить пустые переменные, используя array_filter(). Затем используйте фильтр count().

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

Проверить Fiddle link

+1

@HankyPanky, спасибо за редактирование :) –

+0

Вы говорите, что только 1 переменная пуста. но я хочу только один НЕ ПУСТОЙ. :) – cetipabo

+0

@cetipabo, я изменил ... спасибо за уведомление –

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

Fiddle

Или вы можете просто сделать

var_dump(count(array_filter(array($var1,$var2,$var3)))==1); 

Fiddle

+0

Вы имеете в виду «Точно 1 пуст» – Michel

+1

Нет, я точно имею в виду ровно 2 пустые –

+0

О, я вижу, я неправильно читаю 0: 1 до 1: 0 – Michel

0

Попробуйте это:

$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

+0

Любые причины для Downvote, пожалуйста? – Dave

+0

ОП имеет 3 переменные, только 1 разрешено быть пустым.Ваш ответ таков, что у вас есть 3 переменные, и 2 из них могут быть пустыми. – DanFromGermany

4

Попробуйте это:

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

Почему это вниз? – SanketR

+0

«Я действительно ищу лучший способ проверить, не является ли только один из этих трех var, а 2 других пустых». – Neat

+1

ОП имеет 3 переменные, только 1 разрешено быть пустым. Ваш ответ таков, что у вас есть 3 переменные, и 2 из них могут быть пустыми. – DanFromGermany

25

Booleans возвращают 0 и 1 с array_sum()

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

Не так хорошо, как ответ Хареша, но и хороший. – DanFromGermany

+0

Если вы хотите сделать 100% уверенным, что это целое число без кастинга каждой отдельной переменной, используйте: '(0 + empty ($ var1) + empty ($ var2) +. ..) ' – DanFromGermany

+1

@DanFromGermany' 0 + 'не требуется, потому что вы не добавляете переменные, а выполняете вызов функции' empty() ', который равен' 0' или '1' –

2

Это ситуация, когда вы должны использовать массивы. Теперь у вас есть только 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. Основной принцип этого кода заключается в том, что если вы добавляете больше значений, сама логика не нуждается в изменении.

+0

Ха-ха, ответ по ссылке на другие методы. Исправлено, thatnks – Martijn

7

Для этого я использовал бы 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 

* Я должен был обновить ответ, потому что название «исключающее или» несколько вводит в заблуждение в контексте более двух выражений. Конечно, все комментаторы правы, и эксклюзивные, или это двоичная операция, поэтому разрешая слева направо. 1^1^1 == 1 разрешает 0^1 == 1 и поэтому true. Эксклюзив или действительно ищет нечетное число истин.

Я обновил свой ответ с помощью легко читаемого обходного пути, но это определенно не удовлетворяет меня, и я должен администратор, что я решил огромное заблуждение булевых операторов в моем сознании. В последний раз был неправильно предположение о AND и OR разрешаются слева направо, а не первого AND затем OR *

+1

Странно, был еще один ответ с xor, но он исчез. Ну ладно, вы получаете +1 –

+3

Я тайно взломал SO, чтобы удалить его, чтобы я смог заработать всю репутацию. Пожалуйста, никому не говори. Это наш маленький секрет. –

+2

Downvoted, потому что это не работает. – Kevin

3

побитовое исключающее отлично подходит для этого:.

$var1^$var2^$var3 

Вам мощь есть проблемы, если переменные не перебрасываются в булево, и в этом случае вам нужно будет сделать empty($var) для каждого из них.

Бум. Zero if s.

Update

К сожалению, если они все не пусто, правда^верно^верно == верно

Вам нужно проверить против всех из них верно:

($var1^$var2^$var3) && !($var1 && $var2 && $var3) 
Смежные вопросы