А пока немного о файлах. Внешний по отношению к скрипту файл можно включить в скрипт функцией 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 && $j
Я не буду утверждать, что это лучший на свете алгоритм, и принимаю все предложения по его улучшению. Есть два замечания сразу.
*!* Здесь вычисляется средняя длина строки для следующего цикла. У меня это отлично работало и при $appxlen*=2, но так, наверно, быстрее будет. *!!* Здесь я применил функцию fgetsl(), но это особый разговор.
Функция чтения строки из файла имеет ограничение на длину считываемой строки. А думать о длинах строк при написании гениальных скриптов не хочется. Как быть? Я предлагаю небольшую функцию, аналогичную fgets(), но без неприятного ограничения:
function fgetsl($fp) { while (!feof($fp) && strchr($out," ")) $out.=fgets($fp,1000); return $out; } ?>
Постоянные ссылки
При копировании ссылка на TeaM RSN обязательна!
Оставить комментарий
Вы должны войти, чтобы оставить комментарий.