Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Абстрактный вопрос по оптимизации

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: Вопрос по оптимизации логики приложения
Haron
Отправлено: 20 Апреля, 2011 - 23:34:58
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Есть такой вот абстрактный вопрос:

Как перебрать все возможные состояния нескольких переменных?
Возможно, вопрос задан несколько неясно, так что поясню примером:

Итак, допустим у нас есть две (2) переменные, которые могут быть либо TRUE либо FALSE.
В этом случае перебрать все состояния исчерпывающе - можно так:

PHP:
скопировать код в буфер обмена
  1. if ($var_1 and $var_2)
  2. {
  3.     // Выполняем какой-либо код
  4. }
  5. elseif (!$var_1 and $var_2)
  6. {
  7.     // Выполняем какой-либо код
  8. }
  9. elseif ($var_1 and !$var_2)
  10. {
  11.     // Выполняем какой-либо код
  12. }
  13. elseif (!$var_1 and !$var_2)
  14. {
  15.     // Выполняем какой-либо код
  16. }


В случае с тремя переменными - объём кода - резко возрастает, но ещё пока терпимо:

PHP:
скопировать код в буфер обмена
  1. if ($var_1 and $var_2 and $var_3)
  2. {
  3.     // Выполняем какой-либо код
  4. }
  5. elseif (!$var_1 and $var_2 and $var_3)
  6. {
  7.     // Выполняем какой-либо код
  8. }
  9. elseif ($var_1 and !$var_2 and $var_3)
  10. {
  11.     // Выполняем какой-либо код
  12. }
  13. elseif ($var_1 and $var_2 and !$var_3)
  14. {
  15.     // Выполняем какой-либо код
  16. }
  17. elseif (!$var_1 and $var_2 and !$var_3)
  18. {
  19.     // Выполняем какой-либо код
  20. }
  21. elseif (!$var_1 and !$var_2 and $var_3)
  22. {
  23.     // Выполняем какой-либо код
  24. }
  25. elseif ($var_1 and !$var_2 and !$var_3)
  26. {
  27.     // Выполняем какой-либо код
  28. }
  29. elseif (!$var_1 and !$var_2 and !$var_3)
  30. {
  31.     // Выполняем какой-либо код
  32. }


А теперь допустим, у нас 5 (пять) переменных. Несложно вычислить количество переборов else...if:
Цитата:
Вспоминаем комбинаторику: У нас конечное множество из N элементов, каждый элемент которого может быть либо 0 либо 1 (2 состояния), а это уже
2 в степени N.

Итак для 5 - получаем 32
а для 4 - 16

Итак - вопрос:
Как это сделать проще, эффективней, и чтобы занимало минимум кода? Есть-ли какое-либо универсальное решение?

(Отредактировано автором: 20 Апреля, 2011 - 23:50:45)



-----
И чё?
 
 Top
Мелкий Супермодератор
Отправлено: 20 Апреля, 2011 - 23:50:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Haron пишет:
А теперь допустим, у нас 5 (пять) переменных. Несложно вычислить количество переборов else...if - это 5! (факториал) = 120...

ммм, а почему? 5 булевых переменных дадут 32 возможных комбинации. Вычисляется же как количество возможных значений параметра, возведённые в степень - число параметров.
Факториал - это если у нас имеет значение порядок перечисления параметров. Да и факториал 3х как-то не 8 получится.

Универсальное решение - где-то в области автоматного программирования в общем и в определении неважный параметров в частности.


-----
PostgreSQL DBA
 
 Top
Haron
Отправлено: 20 Апреля, 2011 - 23:51:30
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Цитата:
ммм, а почему? 5 булевых переменных дадут 32 возможных комбинации.

Исправил Улыбка Там не факториал )))


-----
И чё?
 
 Top
evgenijj
Отправлено: 20 Апреля, 2011 - 23:54:52
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Ну, на нас, грешных, всегда проще все свалить. Выбрал пользователь что-то в первом списке -- строим динамически второй. Выбрал во втором -- строим третий. Эта задача давно решена -- о ней сотни статей написаны -- даже я не удержался:
http://blog[dot]webmasterschool[dot]ru/ajax/5/
Я здесь строю всего три списка, но можно построить 30, 40, 50... Сколько браузер выдержит...

(Отредактировано автором: 21 Апреля, 2011 - 00:05:30)

 
 Top
Haron
Отправлено: 20 Апреля, 2011 - 23:56:25
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Давайте более предметно рассмотрим:

Вот к примеру скрипт контролирующий наличие записей в 5 полях. Если в каком-либо поле нет данных, а форма с полями отправилась на сервер, то скрипт должен вернуть ошибку напротив поля, что оно не заполнено. Причём могут быть не заполнено и не одно поле, а два, три или четыре.


-----
И чё?
 
 Top
evgenijj
Отправлено: 21 Апреля, 2011 - 00:03:51
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Давайте так -- мухи отдельно, котлеты -- отдельно. Мы проверяем правильность заполнения формы, или строим динамические списки?
 
 Top
Мелкий Супермодератор
Отправлено: 21 Апреля, 2011 - 00:06:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Haron пишет:
Вот к примеру скрипт контролирующий наличие записей в 5 полях. Если в каком-либо поле нет данных, а форма с полями отправилась на сервер, то скрипт должен вернуть ошибку напротив поля, что оно не заполнено. Причём могут быть не заполнено и не одно поле, а два, три или четыре.

А для чего проверять все поля одновременно?
Проверяйте каждое поле независимо от других. В простейшем случае:
0) перед проверками объявите флаг $is_form_valid=true;
1) если какое-то поле не заполнено, $is_form_valid=false;
2) если после проверки всех полей флаг всё ещё тру - выполняете действие, иначе - что-то не заполнено.


-----
PostgreSQL DBA
 
 Top
SAD
Отправлено: 21 Апреля, 2011 - 00:12:37
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009  
Откуда: Днепропетровск, Украина


Помог: 75 раз(а)




js в помощь!
 
 Top
Haron
Отправлено: 21 Апреля, 2011 - 00:15:09
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




evgenijj пишет:
Давайте так -- мухи отдельно, котлеты -- отдельно. Мы проверяем правильность заполнения формы, или строим динамические списки?

Фактически задача сводится к контролю заполнения формы с произвольным количеством полей.

Мелкий:
Вижу такой код:

PHP:
скопировать код в буфер обмена
  1. $valid_form = true;
  2.  
  3. if ($value_1)
  4. {
  5.      $valid_form = false;
  6. }
  7.  
  8. if ($value_2)
  9. {
  10.      $valid_form = false;
  11. }
  12.  
  13. if ($value_3)
  14. {
  15.      $valid_form = false;
  16. }
  17. .......
  18.  
  19. if ($valid_form)
  20. {
  21.      // действие
  22. }


Код несомненно будет работать. Но... если пользователь не ввёл более двух полей - то вывести ошибку можно будет лишь по одному полю.


-----
И чё?
 
 Top
Мелкий Супермодератор
Отправлено: 21 Апреля, 2011 - 00:24:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Haron пишет:
Но... если пользователь не ввёл более двух полей - то вывести ошибку можно будет лишь по одному полю.

Почему же?
Зависит от того, как выводить ошибки.


-----
PostgreSQL DBA
 
 Top
OrmaJever Модератор
Отправлено: 21 Апреля, 2011 - 00:25:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Haron пишет:
Но... если пользователь не ввёл более двух полей - то вывести ошибку можно будет лишь по одному полю.

Почему? Можно же выводить (или записывать в переменую) информацию по каждому полю
PHP:
скопировать код в буфер обмена
  1. $err = '';
  2. if(поле1 не верно) $err .= 'поле 1 введено не верно<br>';
  3. if(поле2 не верно) $err .= 'поле 2 введено не верно<br>';
  4. if(поле3 не верно) $err .= 'поле 3 введено не верно<br>;
  5. echo $err;

(Отредактировано автором: 21 Апреля, 2011 - 00:25:50)



-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
SAD
Отправлено: 21 Апреля, 2011 - 00:32:42
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009  
Откуда: Днепропетровск, Украина


Помог: 75 раз(а)




используйте js и не мучайте себя и пользователя, который если не заполнит поле, будет по сто раз вводить данные
 
 Top
evgenijj
Отправлено: 21 Апреля, 2011 - 00:35:40
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Нет, теоретически задачка интересная. Так мы тут о теории говорим или о практике?
CODE (htmlphp):
скопировать код в буфер обмена
  1. * A
  2.   **AA
  3.     ***AAA
  4.     ***AAB
  5.   **AB
  6.     ***ABA
  7.     ***ABB
  8. * B
  9.   **BA
  10.       ***BAA
  11.       ***BAB
  12.   **BB

Ведь практически, мы должны спросить пользователя, или нет?
Haron пишет:
Как перебрать все возможные состояния нескольких переменных?

Как и всегда --вложенным циклом.

(Отредактировано автором: 21 Апреля, 2011 - 00:36:44)

 
 Top
Haron
Отправлено: 21 Апреля, 2011 - 00:53:12
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Задачку решил кстати, MVC подход - рулит, определённо. Воспользовался способом Мелкого, по ходу выполнения проверок - контроллер инициализирует определённые переменные в шаблонизаторе (отображении).

Выглядит это примерно так, для трёх переменных:

PHP:
скопировать код в буфер обмена
  1. function check_state($var_1, $var_2, $var_3)
  2. {
  3.     $state = true
  4.  
  5.     if (!$var_1)
  6.     {
  7.          $state = false
  8.          $this -> viewer -> addvar('field_1_error', 'Поле 1 не заполнено');
  9.     }
  10.  
  11.     if (!$var_2)
  12.     {
  13.           $state = false
  14.           $this -> viewer -> addvar('field_2_error', 'Поле 2 не заполнено');
  15.     }
  16.  
  17.     if (!$var_3)
  18.     {
  19.           $state = false
  20.           $this -> viewer -> addvar('field_3_error', 'Поле 3 не заполнено');
  21.     }
  22.     return $state;
  23. }
  24.  

Вышло достаточно гибко, и ничто не мешает впереть например проверку на длину переменной, или валидность.

(Отредактировано автором: 21 Апреля, 2011 - 00:53:36)



-----
И чё?
 
 Top
k0ma
Отправлено: 31 Января, 2015 - 14:21:06
Post Id


Гость


Покинул форум
Сообщений всего: 82
Дата рег-ции: Март 2013  


Помог: 1 раз(а)




Нехочу плодить топики, если не прав пните.
Вобщем ситуация слудующая:
есть база users,
CODE (htmlphp):
скопировать код в буфер обмена
  1.  id     | int(20)    | NO   | PRI | NULL    | auto_increment |
  2. | login  | char(25)   | YES  |     | NULL    |                |
  3. | pass   | char(50)   | YES  |     | NULL    |                |
  4. | ip     | char(20)   | NO   |     | NULL    |                |
  5. | tlimit | bigint(20) | YES  |     | 0       |                |
  6. | tarif  | char(10)   | NO   |     | NULL    |                |
  7. | locked | tinyint(4) | YES  |     | 0       |                |
  8.  

есть код выведи мне данные из базы и в таблицу положи.
надо сделать чтобы была сортировка по tarif,id,login,ip

примерный код, но этот код не работает.
CODE (htmlphp):
скопировать код в буфер обмена
  1. echo "<body><h1>List Users.</h1><br>";
  2. echo "<table border='0' cellspacing='1' bgcolor='#000000'>
  3.   <tr bgcolor='#CCCCFF'>
  4.     <td><a href=listusers.php?sort=login>User</a></td>
  5.     <td><a href=listusers.php?sort=ip>IP adress</a></td>
  6.     <td><a href=listusers.php?sort=tarif>Tarif</a></td>
  7.     <td>Limit, m</td>
  8.     <td>Status</td>
  9.     </tr>";
  10. [b]if ($_GET['sort']!='ip' and $_GET['sort']!='login' and $_GET['sort']!='tarif'){
  11. $QListUsers=mysql_query("SELECT * FROM users ORDER BY login");
  12. if ($_GET['sort']!='login' and $_GET['sort']!='tarif'){
  13.  $QListUsers=mysql_query("SELECT * FROM users ORDER BY ip");
  14.  if ($_GET['sort']!='login' and $_GET['sort']!='ip'){
  15.  $QListUsers=mysql_query("SELECT * FROM users ORDER BY tarif");
  16.   if ($_GET['sort']!='tarif' and $_GET['sort']!='ip'){
  17.    $QListUsers=mysql_query("SELECT * FROM users ORDER BY login");
  18.    }
  19.   }
  20.  }
  21. }[/b]
  22.   while ($RowList=mysql_fetch_array($QListUsers))
  23.   {
  24.   echo "<tr bgcolor='#CCCCCC'>
  25.    <td><a href=traf.php?user=$RowList[login]>$RowList[login]</td>
  26.    <td>$RowList[ip]</td>
  27.    <td>$RowList[tarif]</td>
  28.    <td>$RowList[tlimit]</td>";
  29.     if ($RowList['locked']=='0')
  30.      {
  31.       echo "<td><font color='#00CC00'>active</color></td></tr>";
  32.      } else {
  33.        echo "<td><font color='font color='#FF0000'>block</color></td>";
  34.   echo "</tr>"; }
  35.   }
  36.   echo "</table></body></html>";
  37. ?>
  38.  

Раньше было 2е переменные, логин + ip, можно было написать если не логин то сделай выборку из базы и отсортируй по ip, либо выборка из базы и сортировка по логину, сейчас переменных 5 - я голову сломал уже.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB