Главная > Программирование > РНР: настольная книга программиста
<< Предыдущий параграф
Следующий параграф >>
<< Предыдущий параграф Следующий параграф >>
Макеты страниц

26.12. PHP: Пример программирования

Файл можно включить в скрипт функцией include(). Но это не всегда рационально. Например, вы — гениальный дизайнер — нарисовали прекрасный сайт некой фирме, но вам очень не хочется обновлять каждую неделю их прайс-лист. Вы можете за обновление брать деньги, но много денег за это никто не даст, а повозиться придется. Как обычно готовят прайс-лист в фирме? Скорее всего у них есть какая-нибудь таблица в неком табличном редакторе типа Lotus или Excel. Вот ее бы и положить на сайт, но файл с таблицей хитрого формата, да и размера немалого.

Владея РНР, вы можете легко уйти от рутины. Любой табличный редактор позволяет сохранять листы как текст с разделителями табуляции. Рассмотрим, как можно такой файл красиво вывести в виде таблицы со строками разного цвета.

<?

$fp = fopen(" name of file.tsv; 'r' ) ; // открывается файл,

            //созданный в программе Exel

if($fp):

?>

<table border = 0 cellpadding = 2 cellspacing = 0>

<?

for ($i = 0; !feof($fp); $i++) ; // производится чтение строки файла, //пока не достигается конец, также одновременно

    // удаляются пробелы в конце и строки разбиваются на поля

list($a,$b,$c) = split ("\t", chop (fgets($fp, 1000)));

?>

<tr bgcolor = >>#<?echo $i%2?'f0f0f0' ; 'ffffff' ?>

>>>

<td> <?echo $a ?> </td>

<tdx?echo $b ?> </td>

<td> <?echo $c?x/td>

</tr>

<?endfor?>

</table>

<?fclose($fp); endif ?>

PHP имеет достаточное количество встроенных функций для работы с файлами, но часто хочется этот набор несколько расширить, например чтобы сделать чат. В теории все просто: все посетители пишут в один файл и читают последние несколько строк этого файла. Обратите внимание на функцию tail(), которая работает очень быстро независимо от размеров читаемого файла. Например:

<?

if (!$tail_inc) : // чтобы не включать файл дважды $tail_inc = 1;

function tail($file, $num) { // читаем $num последних строк файла $file

Global $tail start buf; // предполагаемая длина строки

if ($tail_start_buf = = 0) $tail_start_buf = 80;

$appxlen = $tail_start_buf; //примерная длина строки для расчета

$flen = filesize ($file) ; // размер файла

$out = array () ; // то, что вернется

$fp = @fopen($file, 'r');

if ($fp) {

    do {

        if ($num*$appxlen > $flen) $pos = 0; // вычисляем, откуда читать файл

        else $pos = $flen — ($num*$appxlen);

    $out = _readfile ($fp, 1 $pos, $num); // читаем строки до конца файла

    //в следующем цикле длина строки будет равна длине средней

    // прочитанной строки, умноженной на 2

    $appxlen = ($flen - $pos + 1)*$num*2/count($out); //*!*

    }

    while (count($out) != $num && $pos !=0);

    fclose($fp);

}

return $out;

}

// вспомогательная функция

// читает файл $fp с позиции $pos и максимум $num строк

function _readfile ($fp, $pos, $num) {

    fseek($fp, $pos); // позиционируем файл

    $imp = array(); // временный массив

    while { // читаем файл до конца

        $line = chop(fgetsl($fp)); // *!!*

        $tmp[] = $line;

    }

    $j = count($tmp) — $num; // количество лишних строк

    if ($pos !=0 && $j == 0) {

        // если равно, сколько надо строк,

        // чтобы пропустить первую неполную строку, если не хватает строк,

        // выводить все

        $j++;        if ($j<0) {

            $j = 0;

            $xnum = $num — 1;

        }

        else $xnum = $num - 1;

    // переписать в выводной массив нужные строки

    for ($i = 0; $i < $xnum && $j < count($tmp); $i++, $j++)

        $out[$i] = $tmp[$j];

    return $out;

}

endif; //if (!tail_inc)

?>

Это не лучший на свете алгоритм, но все же работоспособный. Есть два замечания по поводу этой программы.

* ! * — здесь вычисляется средняя длина строки для следующего цикла. Можно было написать $appxlen = 2, но так будет быстрее.

*!! * — здесь используется функция fgetsl(). Функция чтения строки из файла имеет ограничение на длину считываемой строки. А думать о длинах строк при написании гениальных скриптов не хочется. Как быть? Воспользуйтесь функцией fgetsl(), аналогичной fgets(), но без неприятного ограничения:

<?

function fgetsl($fp) {

    while (!feof($fp) && strchr($att, "\n"))

        $out .= fgets{$fp, 1000);

    return $out;

}

?>

<< Предыдущий параграф Следующий параграф >>
Оглавление