02 февраля 2006

Булева логика на службе программиста

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


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


Какое-то время назад я овладел одним из таких ключей (вернее, мне объяснили, к какой скважине он подходит - привет Диме Калабину): применением так любимой мной в студенческие годы булевой логики, и спешу поделиться.


Сначала простой пример: вам нужно пробежаться по массиву в цикле и, помимо прочих действий, узнать, была ли хоть в одном подэлементе единица. Используем правила A OR 0 = A, А OR 1 = 1.



<?

$A = false;

for($i=0; $i<sizeof($data); $i++)

{

...

$A = $A ¦¦ $data[$i]["field"];

/* либо */

$A ¦= $data[$i]["field"];

}

?>

3 комментов:

Dmitry Kalabin комментирует...

Представим что у нас 1000 элементов в $data. В $data[3]["field"] находится единица.
997 итераций впустую, когда окончательный результат уже давно известен. :( Мдааа... хорошенькое применение булевой логики для для оптимизации. :((

A4 комментирует...

-1 за невнимателность.
Видел "помимо прочих действий"? А кому надо найти единицу в начале, тот вынырнет из глубин с помощью операторов управления циклом?

A4 комментирует...

Чтобы превентить разногласия, скажу, что я использую этот приём, чтобы, делая много запросов к базе в цикле, узнать, были ли в принципе ошибки или нет, при этом ошибка не должна останавливать цикл:

$error |= $db->fError;

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