09 февраля 2006

Математика

Простой пример. Есть табличка с данными. Пользователь клацает по ссылке в заголовке столбца, и данные сортируются по этому столбцу. Щёлкает ещё раз по тому же столбцу, и режим сортировки меняется с убывания на возрастание.
Я завёл отдельную переменную под режим сортировки, пусть будет $order.
Задачи:
1. Преобразовать пользовательский ввод (wild input) так, чтобы переменная $order принимала только значения 0 или 1.
2. При выводе заголовка столбца значение $order инвертировать для смены режима сортировки.
От использования if я отказался, потому что, допустим, появится ещё один режим, и придётся в первой задаче дописывать целую ветку.
Поэтому я использовал такие тривиальные математические выкладки:
1. Какая функция даёт в результате только 0 или 1? Правильно, нахождение остаток от деления на 2, а чтобы убрать отрицательные значения, возьмём ещё и модуль:
$order = abs($order % 2);

Т.е. в общем случае надо брать остаток от max+1 (соответстенно, в случае расчёта рейтингов в диапазоне 0-10 я находил остаток от 11).
2. Где-то я слышал про такой метод, работает отлично для инверсии: складываем оба варианта и каждый раз вычитаем входной вариант из общей суммы:
echo (1-$order);
Единица здесь получилась из мега-рассчёта 1 = (0+1), т.е. оба варианта в сумме.

2 комментов:

Анонимный комментирует...

А что если использовать
$order = !$order

Булевы функции тоже дают 0 или 1 :-)

А4 комментирует...

Пропарился :]

Ты прав, тут булева логика как нельзя к месту. У меня глаз замылился - я использовал этот кусок для приведения введенного пользователем рейтинга к диапазону 0-10:

$rating = $rating % 11;

Ну и закопипастил по аналогии :]

Отправить комментарий