PHP If / ELSE или оператор Switch/Case
у меня есть входные данные, которые могут быть либо 1, либо 0
$no_required
$on_arrival
$schengen_visa
$uk_visa
$usa_visa
у меня есть следующие случаи, и я хочу, чтобы отобразить сообщение для пользователя для каждого из них
a b c d e
1 0 0 0 0 No Visa Required
0 1 0 0 0 Visa can be obtained on Arrival
0 0 1 0 0 You need Schengen Visa
0 0 0 1 0 You need UK visa
0 0 0 0 1 You need US visa
0 0 1 1 1 You need Either of the Visas
0 0 1 1 0 You need Schengen/UK visa
0 0 1 0 1 You need Schengen/US visa
0 0 0 1 1 You need USA/UK visa
где A B C D E F-вышеуказанные переменные. Что является лучшим и оптимизированным способом отображения результатов.
4 ответов
<?php
$messages = array('10000' => 'No Visa Required', '01000' => 'Visa can be obtained on Arrival');
$no_required = '0';
$on_arrival = '1';
$schengen_visa = '0';
$uk_visa = '0';
$usa_visa = '0';
$result = "$no_required$on_arrival$schengen_visa$uk_visa$usa_visa";
if(array_key_exists($result, $messages)){
echo $messages[$result]; //Visa can be obtained on Arrival
}
?>
условия, ты показываешь может быть смоделирован через битовые маски:
$messages = [
16 => 'No Visa Required',
8 => 'Visa can be obtained ...',
4 => ...
];
вам просто нужно отформатировать отдельные переменные в битовую маску:
$bitmask = ($no_required ? 16 : 0)
| ($on_arrival ? 8 : 0)
| ...;
тогда просто выберите нужное сообщение:
echo $messages[$bitmask];
Примечание: использование констант вместо магических чисел в значительной степени обязательно и здесь, поэтому это будет выглядеть так:
define('VISA_NONE', 1);
define('VISA_ON_ARRIVAL', 2);
...
$messages = [
VISA_NONE => 'No Visa Required',
...,
VISA_US | VISA_UK => 'You need USA/UK visa'
];
// using multiplication instead of conditionals, as mentioned in the comments
$bitmask = $no_required * VISA_NONE
| $on_arrival * VISA_ON_ARRIVAL
| ...;
echo $messages[$bitmask];
оберните все это в соответствующий класс, и у вас есть хороший, читаемый, ремонтопригодный, многоразовый кусок бизнес-логики:
class Visa {
const NONE = 1;
const ON_ARRIVAL = 2;
...
protected $messages = [];
protected $visa;
public function __construct() {
$this->messages = [
static::NONE => 'No Visa Required',
...,
static::US | static::UK => 'You need USA/UK visa'
];
}
/**
* @param int $type One of the class constants.
* @param bool $enabled Whether this type of visa is required.
*/
public function set($type, $enabled) {
$this->visa = $this->visa | $type * (int)(bool)$enabled;
}
public function getMessage() {
return $this->messages[$this->visa];
}
}
$visa = new Visa;
$visa->set($visa::NONE, $no_required);
$visa->set($visa::ON_ARRIVAL, $on_arrival);
echo $visa->getMessage();
Я думаю, что переключатель будет хорошим вариантом:
$val=$no_required.$on_arrival.$schengen_visa.$uk_visa.$usa_visa;
switch($val)
{
case "10000":
echo "No Visa Required";
break;
case "01000"
echo "Visa can be obtained on Arrival.";
break;
case "00100":
echo "You need Schengen Visa";
break;
.
. //Continue to add cases .
}
маленький совет:
почему бы вам не преобразовать все эти двоичные числа в целочисленное значение, а затем передать их через оператор switch?
<?php
$integer_value = convert_binary_to_integer(a,b,c,d,e);
// I'm not sure PHP provdies a function to convert binary numbers to integers number:
// But you can write it yourself. It's pretty easy
switch($integer_value) {
case 16: // As the first combination of a,b,c,d,e corresponds to number 16
// do the appropriate action
break;
// ... and so on
}
?>