Файл можно включить в скрипт функцией 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;
}
?>