Для этого я использовал бы 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
*
Сначала нужно «подрезать» все 'var' '$ var1 = trim ($ var1); $ var2 = trim ($ var2); $ var3 = trim ($ var3); ' затем проверьте его. – koe
Можете ли вы сообщить нам, что такое тип данных переменной? – SanketR
datatype - это текст. – cetipabo