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

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

#>>

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

$flen) $pos=0;
  else $pos=$flen-($num*$appxlen);
  $out=_readfile($fp,$pos,$num); // читаем строчки до конца файла
   // на следующий цикл длиной строки считаем удвоенную среднюю
      прочитанную
  $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); // позиционируем файл
 $tmp=array(); // временный массив
 while (!feof($fp)) { // читаем файл до конца
  $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;
  // переписать в выводной массив нужные строки.
  for ($i=0; $i< $xnum &#038;& $j

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

*!* Здесь вычисляется средняя длина строки для следующего цикла. У меня это отлично работало и при $appxlen*=2, но так, наверно, быстрее будет. *!!* Здесь я применил функцию fgetsl(), но это особый разговор.

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

function fgetsl($fp) {
while (!feof($fp) &#038;& strchr($out,"
")) $out.=fgets($fp,1000);
return $out;
}
?> 



Постоянные ссылки

При копировании ссылка на TeaM RSN обязательна!

URI

Html (ЖЖ)

BB-код (Для форумов)

Оставить комментарий

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