Настройки уведомлений Predicament - PullRequest
1 голос
/ 02 августа 2010

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

Если я просто построю это как число:

HTML код

<tr>
    <td>Alert me when a new message comes in:</td>
</tr>
<tr>
    <td>
       <label><input name="ENREME" type="radio" style="margin-left:30px;" value="EMAIL" <?php if ($smscode == "7" || $smscode == "4") { ?>checked="checked"<?php } ?> tabindex="15" />Email</label>
       <label><input name="ENREME" type="radio" style="margin-left:30px;"  value="SMS" <?php if ($smscode == "7" || $smscode == "5") { ?>checked="checked"<?php } ?> />SMS</label>
       <label><input name="ENREME" type="radio" style="margin-left:30px;"  value="BOTH" <?php if ($smscode == "7" || $smscode == "6") { ?>checked="checked"<?php } ?> tabindex="15" />Both</label>
       <label><input name="ENREME" type="radio" style="margin-left:30px;" value="NONE" <?php if ($smscode == "0") { ?>checked="checked"<?php } ?> />Don't notify me</label>
    </td>
</tr>
<tr>
    <td>Alert me when a new update to my site occurs:</td>
</tr>
<tr>
    <td>
       <label><input name="RECRUITEME" type="radio" style="margin-left:30px;" value="EMAIL" <?php if ($smscode == "7" || $smscode == "1") { ?>checked="checked"<?php } ?> tabindex="15" />Email</label>
       <label><input name="RECRUITEME" type="radio" style="margin-left:30px;"  value="SMS" <?php if ($smscode == "7" || $smscode == "2") { ?>checked="checked"<?php } ?> /> SMS</label>
       <label><input name="RECRUITEME" type="radio" style="margin-left:30px;"  value="BOTH" <?php if ($smscode == "7" || $smscode == "3") { ?>checked="checked"<?php } ?> tabindex="15" />Both</label>
       <label><input name="RECRUITEME" type="radio" style="margin-left:30px;" value="NONE" <?php if ($smscode == "0") { ?>checked="checked"<?php } ?> />Don't notify me</label>
    </td>
</tr>

Переменное кодирование и хранение

<?php
    if ($_POST['ENREME'] == "BOTH" && $_POST['RECRUITEME'] == "BOTH") {
        $notif = 15;
    } elseif ($_POST['ENREME'] == "BOTH" && $_POST['RECRUITEME'] == "SMS") {
        $notif = 14;
    } elseif ($_POST['ENREME'] == "BOTH" && $_POST['RECRUITEME'] == "EMAIL") {
        $notif = 13;
    } elseif ($_POST['ENREME'] == "BOTH" && $_POST['RECRUITEME'] == "NONE") {
        $notif = 12;
    } elseif ($_POST['ENREME'] == "EMAIL" && $_POST['RECRUITEME'] == "BOTH") {
        $notif = 11;
    } elseif ($_POST['ENREME'] == "EMAIL" && $_POST['RECRUITEME'] == "SMS") {
        $notif = 10;
    } elseif ($_POST['ENREME'] == "EMAIL" && $_POST['RECRUITEME'] == "EMAIL") {
        $notif = 9;
    } elseif ($_POST['ENREME'] == "EMAIL" && $_POST['RECRUITEME'] == "NONE") {
        $notif = 8;
    } elseif ($_POST['ENREME'] == "SMS" && $_POST['RECRUITEME'] == "BOTH") {
        $notif = 7;
    } elseif ($_POST['ENREME'] == "SMS" && $_POST['RECRUITEME'] == "SMS") {
        $notif = 6;
    } elseif ($_POST['ENREME'] == "SMS" && $_POST['RECRUITEME'] == "EMAIL") {
        $notif = 5;
    } elseif ($_POST['ENREME'] == "SMS" && $_POST['RECRUITEME'] == "NONE") {
        $notif = 4;
    } elseif ($_POST['ENREME'] == "NONE" && $_POST['RECRUITEME'] == "BOTH") {
        $notif = 3;
    } elseif ($_POST['ENREME'] == "NONE" && $_POST['RECRUITEME'] == "SMS") {
        $notif = 2;
    } elseif ($_POST['ENREME'] == "NONE" && $_POST['RECRUITEME'] == "EMAIL") {
        $notif = 1;
    } elseif ($_POST['ENREME'] == "NONE" && $_POST['RECRUITEME'] == "NONE") {
        $notif = 0;
    }
?>

Мне осталось написать код для 16 возможных переменных (и, таким образом, создать более 100 строк кода). Кто-нибудь может придумать лучший способ объединить этот код? Исходя из сделанного выбора, я хочу, чтобы результат равнялся одной цифре (т. Е. 28 равно, отправлять уведомления по электронной почте и SMS как для новых сообщений, так и для обновлений).

Создание новой таблицы или базы данных и выполнение ссылочных вызовов не является решением, поэтому, пожалуйста, не предлагайте это.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 03 августа 2010

Это пример того, как НЕ знание C ставит вас за стену при разработке простых вещей. Насколько я вижу, самый простой вариант - самый лучший, просто используйте двоичный файл!:

define('SEND_EMAIL',1);
define('SEND_SMS',2);

/* The values are packed together, low bits represent 'update' options,
 * high bits represent 'message' options
 * You can save up to 4 variants (ON/OFF) with 0xf
 */
$options = ((intval($_POST['message']) & 0xf) << 4) | (intval($_POST['update']));

...
// Retrieve options from, say, stored option
$message = ($options >> 4) & 0xf;
$update = $options & 0xf;

/* For readability, this can be a function */
if ($message == (SEND_SMS|SEND_EMAIL)) {
    $message = 'Both';
}
else if ($message == SEND_SMS) {
    $message = 'SMS';
}
else if ($message == SEND_EMAIL) {
    $message = 'Email';
}
1 голос
/ 03 августа 2010

Похоже, что вы действительно ищете, это побитовое решение.Используя биты, вы можете хранить множество логических ключей в одном целом числе.В этом ответе используются некоторые обходные пути, чтобы все было понятно - вы можете использовать значения int напрямую вместо значения pow (2, X), показанного ниже ... считайте, что это «учить человека ловить рыбу».

Если вы 'Мне бы хотелось более лаконичного, хотя и сложного для понимания решения, взглянуть на ответ Аст Дерек.Они оба делают одно и то же и работают по одному и тому же принципу.

Чтобы сохранить их, давайте сделаем два простых переключателя:

switch($_GET['x']) {
   case 'Email': $x = pow(2,0); break; // 1
   case 'Sms':   $x = pow(2,1); break; // 2
   case 'Both':  $x = pow(2,0) + pow(2,1); break;// 3
   default: $x = 0;
}

switch($_GET['y']) {
   case 'Email': $y = pow(2,2); echo "Y Email"; break; // 4
   case 'Sms':   $y = pow(2,3); echo "Y SMS"; break; // 8
   case 'Both':  $y = pow(2,2) + pow(2,3); echo "Y Both"; break; // 12
   default: $y = 0;
}

Как видите, опции None отсутствуют.,Нет просто отсутствие электронной почты или SMS.Кроме того, опция Both определяется не как отдельная опция, а как комбинация обоих.

Теперь, когда у нас есть эти значения, мы можем объединить эти два числа в одно число, так как их соответствующие биты обав разных диапазонах.

$z = $x | $y;

Что произойдет, если взглянуть на биты, - это предположить, что у нас есть X = Email и Y = Оба.

x = 0001 -> (0 + 0 + 0 + 1) -> 1
y = 1100 -> (8 + 4 + 0 + 0) -> 12
    -----
OR: 1101 -> (8 + 4 + 0 + 1) -> 13

Что этодаст вам следующие возможные результаты:

0: x = none, y = none
1: x = email, y = none
2: x = sms, y = none
3: x = both, y = none
4: x = none, y = email
5: x = email, y = email
6: x = sms, y = email
7: x = both, y = email
8: x = none, y = sms
9: x = email, y = sms
10: x = sms, y = sms
11: x = both, y = sms
12: x = none, y = both
13: x = email, y = both
14: x = sms, y = both
15: x = both, y = both

Чтобы определить, какие из них выбраны, просто поверните операцию в обратном направлении.

Чтобы вы могли проверить вещи, я поместил всю настройку вGithub Gist для вас, чтобы наслаждаться и возиться с: http://gist.github.com/505272

Не стесняйтесь спрашивать, если вам нужны разъяснения;Я не уверен, что объяснил это очень четко: /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...