PHP

Комплектующие

Задача PHP-скрипта - выдать заказанную посетителем страницу. Как в библиотеке с одной-единственной книгой. Читатель называет главу и номер страницы в этой главе (во всех главах своя нумерация страниц), библиотекарь (он же - PHP-скрипт) книжку листает, находит нужную главу, в ней - страницу требуемую и читателю под нос сует: готово. Именно так наш скрипт и должен работать. Книжка такая - это двумерный массив: чтобы найти нужную страницу требуется указать главу и номер страницы в главе. В обычных книгах нумерация страниц сплошная, поэтому обычные книги - это одномерные массивы: для того, чтобы найти страницу надо знать только ее номер. Для обозначения переменных в PHP используются любые комбинации букв (лучше латинских) и цифр, перед которыми ставят знак $:

$a, $boom, $c8, $dat112, $page, $example, $num

Тип переменных в PHP не оговаривается, это может быть и число, и буква, и строка, и логическое выражение ('да' или 'нет'). Элементы одномерных массивов обозначаются так:

$page[218], $b[4], $data[77]

В квадратных скобках указывают номера элементов массива (как номера страниц в книге). По умолчанию нумерация начинается с нуля, поэтому первый элемент массива имеет номер 0. Иногда можно ничего не указывать (скобки писать все равно надо) и доверить расстановку номеров скрипту, но об этом потом. Элемнент двумерного массива:

$page[1][4]

Принцип тот же самый - в первой скобке - номер главы, во второй - номер страницы в этой главе. Пока не указан конкретный элемент массива, сам массив по внешнему виду не отличается от переменной. Запись $page может обозначать и переменную, и одномерный массив, и двумерный.

Номер главы и номер страницы нашему скрипту будет сообщать читатель. Пусть номер главы хранится в переменной $hid, а номер страницы в главе - в переменной $vid. Названия переменных могут быть выбраны совершенно произвольно. Тогда затребованная читателем страница содержится в общем массиве страниц $page в виде $page[$hid][$vid]. Чтобы вывести страницу на экран, используется функция 'echo':

echo $page[$hid][$vid];

Обращаем внимание на важную деталь - каждая строка кода заканчивается точкой с запятой. Заказ читателя будем получать методом GET. Существуют и другие методы, но так пока проще. Конструкция выглядит так:

$hid=$_GET['hid'];

для номера главы $hid и

$vid=$_GET['vid'];

для номера страницы $vid в главе. Но при первом запуске скрипта читатель еще не послал запроса, поэтому обе переменные - и $hid и $vid - будут пустыми. Поэтому, чтобы читатель не созерцал пустое пространство, запишем такое условие:

if(!$hid)$hid=0;

В переводе: если(отсутствует номер главы) то номер главы равен 0. PHP понимает запись !$hid так: переменная пустая. Точно так же и для второй переменной:

if(!$vid)$vid=0;

Займемся содержимым. В качестве текста возьмем первые 12 стихов из 'Евгения Онегина' (если нет под руками оригинала, то берем здесь и сохраняем как eugen_onegin.txt), каждый стих будет отдельной страницей. Можно, конечно, вписать в код все страницы массива $page, но есть путь попроще. Пусть все страницы хранятся в одном файле, но между стихами 3 и 4, 6 и 7, 9 и 10 поставим знак #, а между всеми оставшимися - знак |. В нужный момент скрипт прочитает сразу весь текст, потом поделит его на главы и пронумерует их, затем поделит каждую главу на страницы и тоже даст им номера. Ну и, наконец, выдаст читателю его запрос. По порядку: для чтения содержимого файла в PHP используется команда file_get_contents('имя файла'). Если текст хранится в файле eugen_onegin.txt, а считать его из файла мы хотим в переменную $book, то команда будет такая:

$book=file_get_contents('eugen_onegin.txt');

Разберем текст на главы. Воспользуемся функцией explode(), которой передадим символ, по которому делить текст (это #, функции передается обязательно в кавычках) и сам текст (это $book), полученные главы сложим в одномерный массив $chapter:

$chapter=explode("#",$book);

Скрипт поставит номера глав самостоятельно. Ему это можно доверить. Каждую главу нужно поделить на страницы, но глав несколько. Придется сначала делить первую, потом вторую и так далее. Для начала сосчитаем, сколько этих глав. Для получения числа элементов массива пользуются функцией count(), которой нужно передать массив:

count($chapter)

Дальнейшие действия: берем первый элемент массива (главу первую), вспоминаем, что ее номер - 0 (начало нумерации с 0), делим на страницы функцией explode() по разделителю |, потом так же поступаем со второй главой и так далее, пока главы не кончатся. Этот процесс можно организовать в цикл. Задача цикла: пока не кончились главы, делим главы на страницы. Код цикла:

$i=0;
while($i<count($chapter)):
$page[$i]=explode("|",$chapter[$i]);
$i++;
endwhile;

$i - счетчик цикла, до начала цикла мы его устанавливаем равным нулю. Сам цикл:

while($i<count($chapter)):

endwhile;

Пока будет выполнено условие: счетчик цикла меньше числа элементов массива $chapter, будет выполняться записанные в цикле операции. Как только счетчик станет больше числа элементов, цикл закончится. Теперь о том, что делается в цикле.

$page[$i]=explode("|",$chapter[$i]);
$i++;

Первая строка разделяет главу с номером, равным значению счетчика на страницы и помещает эти страницы в массив $page[$i], следущая строка увеличивает счетчик на единицу. В результате работы цикла образуется двумерный массив $page, в котором первый индекс соответствует номеру главы, а второй - номеру страницы в этой главе. Осталось выдать страницу. Сделаем это так:

$out=nl2br($page[$hid][$vid]);

$out - это то, что мы отсылаем читателю. Функция nl2br формирует переносы, это - для того, чтобы текст был похож на исходный. Настало время собрать все вместе. Вперед.

Рейтинг@Mail.ru