Программирование |
Web мастеру |
3D Графика и анимация |
Сетевая безопасность |
Гостевая книга |
Форум |
Ссылки |
Услуги |
|
|
На главную страницу > > В раздел программирование > > В раздел PHP | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Классы в php3. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Когда достаём из базы данных много подобной
информации мы её конечно же в массив оформляем.
Если нам надо блок разнотипной информации как
одно целое хранить и обрабатывать - создаём
объект, используя описание класса как трафарет.
Ну а если подобных объектов несколько - массив
обектов. Как такую штуку запустить попробую
показать.
Например стоит старинная задача: из пункта "А" доехать в пункт "В" на автобусе. Всего автобусных маршрутов в городке - 34, остановок по городку - 99, в некоторые дни отдельные маршруты не ходят. Но вся информация имеется в базе данных и организована следующим образом: table common
В этой таблице перечисленны ID остановок ( int ) и их названия ( string )
table common_2
Здесь показано на какой остановке - её ID ( int ) какие маршруты останавливаются ( string )
table routes
Показывает програмное имя маршрута ( string ), его реальное имя ( string ) и в какой день недели этот автобус ходит, а в какой нет ( начинаем с воскресенья )
и по каждому маршруту у нас имеется таблица rt01, rt02, ..., rt34 ( приведу пример лишь для первого маршрута ) table rt01
где показан порядковый номер остановки ( int ) , ID этой остановки ( int ) и строка ( string ) в которой перечисленно время в которое данный автобус останавливается на каждой остановке.
Необходимо определить на каком автобусе можно доехать до нужной останвки, а если невозможно на одном, то на какой остановке пересесть на другой маршрут. Возможность двух пересадок рассматривать не будем, так как на скрипте такие вычисления гонять неразумно - долго будет. Вся необходимая информация - названия, времена выдаётся пользователю. Вытаскиваем ( из базы данных ) все автобусы останавливаюшиеся на остановке start. Смотрим, а можем ли добраться на каком нибудь из них до остановки finish? Выдаём информацию, далее смотрим все автобусы останавливающиеся на остановке finish ( не совпадающие с первым запросом ) и смотрим, а где же можем пересесть на эти автобусы с тех, что идут с остановки start. Выдаём результат. Вроде всё просто, но запутаешься во всех этих переменных. И другое дело если есть объект, который хранит всю информацию о маршруте, и другой объект, хранящий всю информацию о автобусной остановке, который содержит массив объектов первого типа - маршруты. Классы, по которым будем создавать эти объекты назовём Route - маршрут, Bus_stop - остановка. Получается что нам надо создать две переменных типа Bus_stop - одна на остановку start и одна на остановку finish. Ну а колличество объектов типа Route в каждом объекте типа Bus_stop будет определяться колличеством останавливающихся на этой остановке маршрутов. При данном подходе оперируем на уровне объектов, то есть переменных немного и всё наглядно. При необходимости вытаскиваем нужную информацию из объекта. Ну а как это работает: Файл choice.php3 <form action="find.php3" method=post > echo "<select
name=\"place_is\" size=10>"; и позволяет пользователю задать пункт отправления и пункт назначения. Данные, понятное дело, выбираются из базы данных ( ну не писать же дважды по сотне остановок в html форме ), оформляются в виде стандартной формы, ну а запрос пользователя пересылаем в файл find.php3 <?php
с которым то же всё просто - выдать на экран некоторую контрольную информацию - день недели и запустить собственно программу get_result(...). Основной код - в файле functions.php3. Функция get_result($start, $finish) открывает базу данных и создаёт две переменных типа Bus_stop. $db = mysql_connect("localhost",
"root"); При создании каждой переменной этого типа запускается constructor, извлекаеся нужная информация об этой автобусной остановке из базы данных, с помощью вспомогательной функции cut_str(...) строка,где перечисленны все останавливающиеся здесь автобусы, разделяется на составляющие и в результате получаем массив названий автобусов,которые останавливаются на этой остановке. function Bus_stop($name, $db) {
После чего контрольный вывод этих самых имён. Теперь в цикле создаём объекты типа Route и упаковываем их в массив for($ll=0; $ll<$k;
$ll++) { Tак же constructor класса Route получает имя маршрута и по нему, извлекая нужную информацию из базы данных, создаёт объект - переменную этого типа. function Route($name, $db) { Теперь, для поиска автобусов, на которых можем добраться от start до finish, вызываем функцию find_direct(...) принадлежащую объекту остановки start, передав в неё ID остановки finish. Ну и смотрим, есть ли у маршрутов, на которые мы можем сесть на остановке start остановка на которую нужно попасть, но важно чтоб она была после того как мы сядем, поскольку марщруты в основном кольцевые и возвращаютсядругой дорогой. Если есть такая, то нужная информация извлекается из объекта и выдаётся пользователю. function find_direct($id_stop_finish) {
А вот вторым шагом мы в объект типа Route, созданный для остановки start передаём такой же объект созданный для остановки finish как параметр функции find_one_change(...), для поиска возможных пересадок с маршрута который останавливается на остановке start, на маршрут, останавливающийся на остановке finish. function find_one_change($routes_finish) {
Для работы этой функции привлекается вспомогательная функция find_able(...) В которую как параметр передаём объект - маршрут отходящий от остановки start и объект - маршрут который останавливантся на остановке finis. Проверям возможность пересадки с первого на второй. При этом для каждого автобуса отходящего от остановки start сканируем по его становкам от остановки посадки и смотрим, а есть ли такая же у автобуса, который останавливается на остановке finish. Если есть, то в возвращаемую переменную $ret ( array ) записываем индексы для этой остановки для первого и для второго $ret[1]=$i; $ret[2]=$j; и потом смотрим, а есть ли у финиширующего автобуса остановка назначения после этой самой остановки пересадки. Если есть - записываем $ret[3]=$j; Отработав, функция возвращает $ret[] и если 4-й элемент $ret ( $ret[3] ) равен 0, то значит мы не можем пересесть с первого на второй и достичь остановки назначения. Найдя искомую остановку ( то есть ту, на которой останавливаются и тот и другой маршруты ) по её ID из базы данных получим имя, вся остальная информация находиться в объектах и остаётся только выдать её пользователю. В данном случае не найдено прямого маршрута, то есть на который мы можем сесть на остановке start и добраться до остановки finish, но есть возможность добраться до остановки назначения с пересадкой - указан маршрут на который нужно сесть и строка времён, кагда он останавливается здесь. Указана остановка на которой необходимо сойти для пересадки на другой маршрут и строка времён, когда вы прибудете на неё. Далее такая же информация про маршрут, на который следует пересесть: строка времён, когда он бывает на данной остановке и когда он останавливается на остановке finish. В данном примере, несмотря на то что маршрут 1 останавливается и на остановке start и на остановке finish как возможный он не показан - дело в том, что проходит он их в обратном для нас порядке. В bus.zip вы можете получить эту програмку, установить её у себя и посмотреть, выводя данные из интересных для вас точек прописывая echo"<br> name_var=$name_var"; В фолдере create_tables найдёте всё необходдимое. На Linux просто "руками" создайте базу данных BUS_STOP, войдите в фолдер create_tables, файл createTables.sh сделайте исполняемым и запустите его. Все необходимые таблицы в BUS_STOP будут созданы и заполнены. Скрипт createTables.sh использует файлы, находящиеся там же, и если не получается - можно руками, создать таблицы, заглядывая в файл create_all_tables.dump и заполнить их используя файлы common, common_2, routes и rt01, rt02, ..., rt34. Пользователям Windows видимо так и придётся... :-( . После установки базы данных BUS_STOP файлы choice.php3, find.php3 и functions.php3 положить, как обычно, под Apache и запустить choice.php3. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
На главную страницу > > В раздел программирование > > В раздел PHP | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||